Schrijvers archief Tobias Stephan

doorTobias Stephan

shopware inbrengen in winkelwagen werkt niet

Vandaag belt een klant en klaagt dat hij een artikel niet in het winkelwagentje kan stoppen… omdat er voortdurend andere bestellingen binnenkomen, denk je dat het niet de winkel kan zijn. Nou ja, misschien maakt de klant een “domme” fout…verre van dat…de klant had gelijk! De oplossing was heel eenvoudig! De winkel was toegankelijk via http: zowel als via de gecodeerde SSL-pagina. Een automatische doorverwijzing naar https://www.leckerstecker.de bracht de oplossing. Soms kan het ook eenvoudig zijn.

De gebruikelijke oproep zal zeker via een zoekmachinelink verlopen…maar hier heeft de klant daadwerkelijk de directe weg gekozen. Ik wil er niet aan denken hoeveel bedrijven we gemist hebben door deze kleine fout.

doorTobias Stephan

SwiftUI TableView ListView example sample code project

Naar mijn mening is SwiftUI een absolute mijlpaal in de softwareontwikkeling. Het kost zeker tijd om te wennen aan deze nieuwe manier van ontwikkelen, maar de tijd die u bespaart op verdere projecten kan goed worden geïnvesteerd. Hier vindt u een eenvoudig voorbeeld van een SwiftUI TableView. Het voorbeeldproject kan gratis worden gedownload en gebruikt. Het project bevat bewust niet meer, zodat de essentiële functies bijdragen aan het begrip.

Download XCode Sample Project.

Het is vrij indrukwekkend hoe weinig regels code u met SwiftUI een TableView / ListView kunt maken. Maak gewoon een nieuw project aan en zorg ervoor dat SwiftUI als gebruikersinterface wordt geselecteerd.

SwiftUI Interace selektieren

Uiteraard heeft u voor dit voorbeeld nog 3 afbeeldingen nodig, deze zijn ook opgenomen in het voorbeeldproject.

Assets für die Bilder in der Liste

Der eigentliche Code für das Projekt.

import SwiftUI

struct ContentView: View {
    var oListArray: [oListenEntries] = testData
    var body: some View {
        List(oListArray) { item in
            Image(item.imageName).resizable().frame(width: 32.0, height: 20.0)
            VStack(alignment: .leading){
                Text(item.make)
                Text(item.model)
                    .font(.subheadline)
                    .foregroundColor(Color.gray)
            }
        }
    }

    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView(oListArray: testData)
        }
    }
}

Hier is de code voor de onderliggende array. Hiervoor heb ik een SwiftUI view gemaakt met de naam oListEntries.swift.

import SwiftUI

struct oListenEntries : Identifiable {
    var id = UUID()
    var make: String;
    var model: String;
    var imageName: String { return make }
}

let testData = [
    oListenEntries(make: "Flaschenhalter", model: "für Balkon oder Pool"),
    oListenEntries(make: "Pooladapter", model: "32 mm auf 12 mm"),
    oListenEntries(make: "Sektglashalter", model: "schwimmend")
]
doorTobias Stephan

Swiftui tabbar selecteditem

Tijdens mijn eerste pogingen met Swift UI probeerde ik wanhopig uit te zoeken hoe ik het actieve tabblad programmatisch kon selecteren. De truc zit hem in de binding.

@State public var selection = 0

Met een klik op de knop selectie vertelt de waarde een. Aangezien Selectie direct gekoppeld is aan de tabbladbalk, verandert het actieve tabblad-item naar wens.

Button("Go",action: {self.selection = 1})

Bindend is het access token dat u kunt doorgeven om directe lees- en schrijftoegang tot de waarde mogelijk te maken zonder bezit (in de zin van het behouden van een referentietype) of kopiëren (voor een waardetype).

Wanneer de gebruiker een tabblad in het tabbladoverzicht selecteert, verandert hij of zij de waarde eenzijdig via binding en wijst de bijbehorende .tag(…) toe aan de geselecteerdeTab-variabele. Dit werkt op dezelfde manier voor @State en ObservableObject.

De programmeur kan ook op elk moment een waarde aan deze geselecteerde tabbladvariabele toekennen – en het tabbladView schakelt onmiddellijk naar het getoonde tabblad.
Dit is de sleutel tot programmatische navigatie in SwiftUI.

Hier is een voorbeeld dat je direct kunt kopiëren / plakken om ermee te spelen.

import SwiftUI

struct ContentView: View {
    @State public var selection = 0

    let defaults = UserDefaults.standard

    var body: some View {
        TabView(selection: $selection){
            VStack {
                Text("First View")
                Button("Go",action: {self.selection = 1})
            }
            .font(.title)
            .tabItem {
                VStack {
                    Image("first")
                    Text("First")
                }
            }
            .tag(0)
            Text("Second View")

                .font(.title)
                .tabItem {
                    VStack {
                        HStack{
                            Image("second")
                            Text("Second")
                        }
                    }
            }
            .tag(1)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
doorTobias Stephan

Swift Substring to String Conversion

Deze snaaroperaties in Swift kunnen je gek maken, zelfs als je gewend bent aan een eenvoudige van C#. Daarom heb ik er naar gekeken en een beetje van dit alles in elkaar gezet. Dit werd getest met Swift 5.1

  • startIndex is de index van het eerste teken
  • endIndex is de index na het laatste teken
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let str = "Hello, playground"
        print(str[str.startIndex]) // H
        //print(str[str.endIndex])   // error: after last character

        let rangeStartToEnd = str.startIndex..<str.endIndex
        print("Range: " + str[rangeStartToEnd])  // "Hello, playground"

        let rangeWithoutGround = str.startIndex..<str.index(of: "ground")!
        print("Range: " + str[rangeWithoutGround])  // "Hello, playground"
    }

verwijst naar de index van het teken direct voor de gespecificeerde index.

// character
let index = str.index(before: str.endIndex)
str[index]  // d

// range
let range = str.startIndex..<str.index(before: str.endIndex)
str[range]  // Hello, playgroun

De OffsetBy waarde kan positief of negatief zijn en begint met de gespecificeerde index. Hoewel het van het type String.IndexDistance is, kunt u een Int-waarde doorgeven.

De limitedBy is nuttig om ervoor te zorgen dat de offset niet leidt tot overschrijding van de limieten van de index. Het is een limietindex. Aangezien het mogelijk is dat de offset de grenswaarde overschrijdt, geeft deze methode een optioneel karakter. Het geeft nul terug als de index buiten de limieten valt.

Als de verrekening 77 in plaats van 7 zou zijn geweest, dan zou de if-afrekening zijn overgeslagen.

Wat is het probleem?

Het zou veel gemakkelijker zijn om een Int-index voor snaren te gebruiken. De reden dat je voor elke string een nieuwe String.index moet maken is omdat de karakters in Swift niet allemaal even lang zijn onder de motorkap. Een enkel Swift-karakter kan bestaan uit één, twee of zelfs meer Unicode-codepunten. Daarom moet elke unieke string de indexen van zijn karakters berekenen.

Het is mogelijk om deze complexiteit te verbergen achter een Int-index extensie, maar ik aarzel om dat te doen. Het is goed om herinnerd te worden aan wat er werkelijk gebeurt.

Een nuttige Extension

De volgende Extenson moet worden toegevoegd onder uw klasse in de code. Deze uitbreiding biedt u de mogelijkheid om de index van een hele string binnen een string te bepalen. In mijn voorbeeld “grond”.

String operaties worden dus aangepakt via indices en ranges. De index is dus geen eenvoudige gehele variabele.

Dieser Block enthält unerwarteten oder ungültigen Inhalt.LösenZu HTML umwandeln

extension StringProtocol {
    func index(of string: S, options: String.CompareOptions = []) -&gt; Index? {
        range(of: string, options: options)?.lowerBound
    }
    func endIndex(of string: S, options: String.CompareOptions = []) -&gt; Index? {
        range(of: string, options: options)?.upperBound
    }
    func indices(of string: S, options: String.CompareOptions = []) -&gt; [Index] {
        var indices: [Index] = []
        var startIndex = self.startIndex
        while startIndex &lt; endIndex,
            let range = self[startIndex...]
                .range(of: string, options: options) {
                indices.append(range.lowerBound)
                startIndex = range.lowerBound &lt; range.upperBound ? range.upperBound :
                    index(range.lowerBound, offsetBy: 1, limitedBy: endIndex) ?? endIndex
        }
        return indices
    }
    func ranges(of string: S, options: String.CompareOptions = []) -&gt; [Range] {
        var result: [Range] = []
        var startIndex = self.startIndex
        while startIndex &lt; endIndex,
            let range = self[startIndex...]
                .range(of: string, options: options) {
                result.append(range)
                startIndex = range.lowerBound &lt; range.upperBound ? range.upperBound :
                    index(range.lowerBound, offsetBy: 1, limitedBy: endIndex) ?? endIndex
        }
        return result
    }
}
doorTobias Stephan

Shopware API-artikel wordt niet weergegeven

Als het artikel niet in de winkel wordt getoond, kan dit verschillende redenen hebben. Na verloop van tijd zult u een gevoel ontwikkelen voor de “shopware behoeften”. Eerst moet u controleren of het artikel in een actieve categorie is ingedeeld. Als dit niet het geval is, kan het artikel niet worden weergegeven. Als u de artikelen maakt met behulp van de API, moet het artikel worden ingesteld op actief = waar in zowel het artikel-object als het artikel-detail-object.

doorTobias Stephan

iPhone-app voor de Dremel 3d45 3D40 3D-printer software

Nieuwe versie 1.17 vanaf 02. Mei 2020
De app voor de Dremel printers is nu volledig vertaald in 5 talen. Ook de door de drukker geleverde feedbacks zijn vertaald. De app is beschikbaar in het Engels, Duits, Frans en Italiaans.

Download via Apple App Store

Nieuwe versie 1.14 d.d. 23 april 2020
Na het updaten naar IOS versie 13.4.1, zorgde dit ervoor dat de app voor sommige gebruikers crashte. Het probleem is met deze versie opgelost.

Met deze app kunt u tot 3 Dremel 3D45-printers bekijken die uw 3D-objecten maken. Verder zijn er gedetailleerde statusmeldingen, zoals een tijdberekening tot het object klaar is of een mogelijkheid om een afdruk te annuleren. Dit is vooral handig als u in één oogopslag wilt controleren of alles in orde is tijdens het afdrukproces. Het voordeel is dat u op tijd kunt ingrijpen om het object in perfecte conditie ter wereld te brengen. U hoeft alleen maar het interne IP-adres van het apparaat in te voeren onder de instellingen en u bent klaar om te gaan. Met behulp van de instellingen van uw Dremel 3D45 kunt u een lokaal IP-adres instellen of het automatisch toegewezen V4 IP-adres gebruiken. Het IP-adres van uw Dremel 3D45 kunt u vinden in de instellingen. Het statusdisplay bevat informatie over de voortgang, de spuitmondtemperatuur, de tijd, open of gesloten deuren, de platformtemperatuur, de kamertemperatuur, de naam van het afdrukbestand en het bestandstype.

Huidige statusinformatie zoals de verwachte voltooiingsduur van het object en een voortgangsindicator in procenten of de huidige spuitdooptemperatuur. Is de deur of het deksel gesloten? De app geeft het weer. Temperatuur van de kamer of het platform, met deze app bent u op de hoogte. U kunt nu met de knop Annuleren een afdruk direct vanuit de app annuleren.

De app voor de Dremel 3D45 – status en controle van uw 3D-printer!

doorTobias Stephan

webkit disable scrolling in swift

Als u niet wilt dat de webview scrolbaar is, kunt u deze eenvoudig uitschakelen met de volgende regels code.

<span class="s2">webKitView1.</span>scrollView<span class="s1">.</span>isScrollEnabled<span class="s1"> = <b>false</b></span>
<span class="s1">
<span class="Apple-converted-space">&nbsp; &nbsp; &nbsp; </span></span>
<span class="s2">webKitView1.</span>scrollView<span class="s1">.</span>panGestureRecognizer<span class="s1">.</span>isEnabled <span class="s1">=</span> <span class="s1"><b>false
</b></span>
<span class="s2">webKitView1.</span>scrollView<span class="s1">.</span>bounces<span class="s1"> = <b>false</b></span>
<figure><img width="676" height="124" class="alignleft wp-image-541" src="http://www.exoda.de/wp-content/uploads/Bildschirmfoto-2019-10-05-um-13.29.41-300x55.png" alt=""></figure>