Autor-Archiv Tobias Stephan

VonTobias Stephan

Swiftui tabbar selecteditem

Durante i miei primi tentativi con Swift UI, ho cercato disperatamente di capire come selezionare la scheda attiva in modo programmatico. Il trucco sta nella rilegatura.

@State public var selection = 0

Con un clic sul tasto di selezione del tasto viene visualizzato il valore uno. Poiché la selezione è collegata direttamente alla barra delle schede, la voce attiva della scheda cambia a piacere.

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

Il binding è il token di accesso che si può passare per consentire l’accesso diretto in lettura e scrittura al valore senza concedere il possesso (nel senso di mantenere un tipo di riferimento) o la copia (per un tipo di valore).

Quando l’utente seleziona un tab nella vista tab, cambia il valore unilateralmente tramite binding e assegna il corrispondente .tag(…) alla variabile selectedTab. Questo funziona allo stesso modo per @State e ObservableObject.

Il programmatore può anche assegnare un valore a questa variabile selezionataTab in qualsiasi momento – e la TabView cambia immediatamente la scheda visualizzata.
Questa è la chiave per la navigazione programmatica in SwiftUI.

Ecco un esempio che si può copiare / incollare direttamente per giocare con esso.

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()
    }
}
VonTobias 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()
    }
}
VonTobias Stephan

Swiftui tabbar selecteditem

Lors de mes premières tentatives avec Swift UI, j’ai essayé désespérément de trouver comment sélectionner l’onglet actif par programmation. L’astuce est dans la reliure.

@State public var selection = 0

En cliquant sur le bouton, la sélection indique la valeur un. Comme la sélection est directement liée à la barre d’onglets, l’élément actif de l’onglet change selon les besoins.

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

La liaison est le jeton d’accès que vous pouvez passer pour permettre un accès direct en lecture et en écriture à la valeur sans en accorder la possession (au sens de conserver un type de référence) ou la copie (pour un type de valeur).

Lorsque l’utilisateur sélectionne un onglet dans l’affichage des onglets, il modifie la valeur unilatéralement par liaison et affecte le .tag(…) correspondant à la variable Tab sélectionnée. Cela fonctionne de la même manière pour @State et ObservableObject.

Le programmeur peut également attribuer une valeur à cette variable Tab sélectionnée à tout moment – et le TabView bascule immédiatement l’onglet affiché.

C’est la clé de la navigation programmatique dans SwiftUI.

Voici un exemple que vous pouvez copier / coller directement pour jouer avec.

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()
    }
}
VonTobias Stephan

Swiftui tabbar selecteditem change

During my first attempts with Swift UI, I tried desperately to figure out how to select the active tab programmatically. The trick is in the binding.

@State public var selection = 0

With a click on the button selection tells the value one. Since Selection is directly linked to the tab bar, the active tab item changes as desired.

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

Binding is the access token that you can pass to allow direct read and write access to the value without granting possession (in the sense of retaining a reference type) or copying (for a value type).

When the user selects a tab in the tab view, he or she changes the value unilaterally via binding and assigns the corresponding .tag(…) to the selectedTab variable. This works the same way for @State and ObservableObject.

The programmer can also assign a value to this selectedTab variable at any time – and the TabView immediately switches the displayed tab.

This is the key to programmatic navigation in SwiftUI.

Here is an example that you can copy / paste directly to play around with it.

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()
    }
}
VonTobias Stephan

Swiftui tabbar selecteditem auswählen

Bei den ersten Gehversuchen mit Swift UI habe ich krampfhaft versucht herauszufinden, wie man das aktive Tab programmatisch auswählt. Der Trick liegt im Binding.

@State public var selection = 0

Mit Klick auf den Button erzählt selection den Wert eins. Da Selection direkt an die Tabbar gebunden ist, ändert sich das aktive Tabitem wunschgemäß.

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

Binding ist das Zugriffstoken, das Sie weitergeben können, um direkten Lese- und Schreibzugriff auf den Wert zu ermöglichen, ohne den Besitz (im Sinne der Beibehaltung eines Referenztyps) oder das Kopieren (für einen Werttyp) zu gewähren.

Wenn der Benutzer eine Registerkarte in der Registerkartenansicht auswählt, ändert er den Wert einseitig über Bindung und weist der ausgewähltenTab-Variablen das zugehörige .tag(…) zu. Dies funktioniert für @State und ObservableObject auf die gleiche Weise.

Der Programmierer kann dieser ausgewähltenTab-Variablen auch jederzeit einen Wert zuweisen – und die TabView schaltet die angezeigte Registerkarte sofort um.
Dies ist der Schlüssel zur programmatischen Navigation in SwiftUI.

Hier ist ein Beispiel, daß man direkt Copy / Paste übernehmen kann um damit rumzuspielen.

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()
    }
}
VonTobias Stephan

Listory.net – das Listentool

Listory als kostenlose Webapplikation

Listory ist das Tool ohne Kontenregistrierung zur schnellen Liste. Aufgaben? Einkaufsliste? …was auch immer, Listory hilft Dir schnell und kostenlos.

Listen, die mit Listory erstellt wurden, sind vor allem leicht mit anderen zu teilen. Du kannst die Liste gleichzeitig mit mehreren Personen abarbeiten. Stell Dir vor, Du gehst mit deiner Familie einkaufen. 4 Personen fangen an im Supermarkt die Dinge zu sammeln, die in der Liste steht. Klickst Du auf erledigt…ist der Einträg für Dich und die anderen Nutzer ersteinmal verschwunden. Der Eintrag taucht aber wieder auf! Das ist ja das Besondere! Deine Listen sind damit also wiederverwendbar. Das ist ein entscheidender Vorteil.

Den Listory Lister von eXODA kannst Du für Deine täglichen Aufgaben nutzen. Das kann auch Einkaufen sein. Hier hat Listory sogar eine besondere Funktion. Listory kann scannen und Fotos hinterlegen. Wenn Du ein Produkt fotografierst, sehen halt auch andere, die Zugriff auf die Listen haben, wie das Produkt aussieht.

Wofür brauche ich die App?
Die App, die derzeit nur für IOS, also Apple Geräte erhältlich ist, hat wesentlich mehr Funktionen. Die App gibt es in einer kostenlosen und kostenpflichtigen Variante.

Wie ist das mit dem Datenschutz?
Listory funktioniert einfach so, ohne Anmeldung. Wie geht das? Der Listory Lister generiert bei der ersten Nutzung einen eindeutigen Token (Schlüssel). Wer den Schlüssel hat, hat Zugriff! Der Schlüssel steckt im Link drin. Du solltest den Link also gut sichern. Wir wissen aber nicht, wer Du bist und wollen das auch gar nicht wissen. Deine Daten gehören Dir!

Werden Cookies verwendet?
Ja schon, aber nur für die Grundfunktion. Listory Lister erkennt, dass Du schon einmal da warst und erhält gleich den Schlüssel. Mehr Cookies werden nicht gespeichert.

VonTobias Stephan

Shopware einfügen in Warenkorb legen funktioniert nicht

Da ruft heute ein Kunde an und beschwert sich er könne keinen Artikel in den Warenkorb legen…da ständig andere Bestellungen reinrauschen, denkt man, es könne nicht am Shop liegen. Na vielleicht stellt der Kunde sich „blöd“ an…weit gefehlt…der Kunde hatte Recht! Die Lösung war ganz einfach! Der Shop war sowohl über die http: als auch über die verschlüsselte SSL-Seite erreichbar. Eine automatische Umleitung auf die https://www.leckerstecker.de brachte die Lösung. Manchmal kann es auch einfach sein.

Sicherlich wird der übliche Aufruf über einen Suchmaschinen Link erfolgen…aber hier hat der Kunde tatsächlich direkt den direkten Weg gewählt. Ich möchte nicht darüber nachdenken, wie viele Geschäfte uns durch den kleinen Fehler entgangen sind.

VonTobias Stephan

c# switch case beispiel

Hier ein kurzes Beispiel für eine einfach c# switch case Variante


using System;

public enum Color { Red, Green, Blue }

public class Example
{
   public static void Main()
   {
      Color c = (Color) (new Random()).Next(0, 3);
      switch (c)
      {
         case Color.Red:
            Console.WriteLine("The color is red");
            break;
         case Color.Green:
            Console.WriteLine("The color is green");
            break;
         case Color.Blue:
            Console.WriteLine("The color is blue");   
            break;
         default:
            Console.WriteLine("The color is unknown.");
            break;   
      }
   }
}
VonTobias Stephan

Swift Substring to String

Ces opérations sur les cordes en Swift peuvent vous rendre fou même si vous êtes habitué à un simple à partir du C#. C’est pourquoi je me suis penché sur la question et j’ai rassemblé un peu de ça. Ceci a été testé avec le Swift 5.1

  • startIndex est l’indice du premier caractères
  • endIndex est l’index après le dernier caractère
    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..



before fait référence à l'index du caractère qui précède directement l'index spécifié.

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

// range
let range = str.startIndex..



La valeur OffsetBy peut être positive ou négative et part de l'indice spécifié. Bien qu'il soit de type String.IndexDistance, vous pouvez passer une valeur Int.

// character
let index = str.index(str.startIndex, offsetBy: 7)
str[index]

// range
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..



Le limitedBy est utile pour s'assurer que le décalage n'entraîne pas le dépassement des limites de l'indice. C'est un indice limite. Comme il est possible que le décalage dépasse la limite, cette méthode renvoie une option. Il retourne zéro si l'indice est en dehors des limites.

if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
    str[index]
}

Si le "offset" avait été 77 au lieu de 7, l'énoncé if aurait été sauté.

Warum denn nun der ganze Umstand?

Il serait beaucoup plus facile d'utiliser un index Int pour les cordes. La raison pour laquelle vous devez créer un nouveau String.index pour chaque chaîne est que les caractères dans Swift ne sont pas tous de la même longueur sous le capot. Un seul caractère Swift peut être constitué d'un, deux ou même plusieurs points de code Unicode. Par conséquent, chaque chaîne unique doit calculer les indices de ses caractères.

Il est possible de cacher cette complexité derrière une extension d'index Int, mais j'hésite à le faire. Il est bon de se rappeler ce qui se passe réellement.

Une extension utile

L'Extenson suivant doit être ajouté sous votre classe dans le code. Cette extension vous offre la possibilité de déterminer l'index d'une chaîne entière dans une chaîne de caractères. Dans mon exemple "terre".

Les opérations sur les chaînes de caractères sont donc traitées par le biais d'indices et de plages. L'indice n'est donc pas une simple variable integer.

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

Searchbar mit 2D Array verbinden und ein TableView durchsuchen Swift 5.1

Hier findest Du die wesentlichen Dinge, die Du brauchst um ein TableView zu durchsuchen. Zuerst ziehst Du mal eine Searchbar aus dem Objektkatalog und erstellst im Code ein Outlet.

Nachdem Du das Outlet im Quelltext gesetzt hast, setze das delegate.

Jetzt benötigen wir noch eine Variable „searching“ sowie ein weiteres 2-dimensionales Array. Die Variable searching bekommt den Wert true, während eine Suche stattfindet. Hier im Beispiel siehst du die Variable für das 2. Array, dass baugleich mit dem Array results ist. In das 2. Array wird jeweils das Filterergebnis gesetzt. Jetzt weißt Du, warum wir die Boolean Variable „searching“ benötigen. So kann man für alle weiteren Aktionen im Code abfragen, aus welchem Array man sich gerne bedienen möchte. Je nachdem ob halt gerade gesucht wird oder die Komplette Liste im Tableview dargestellt wird.

var searching = false
var filteredresults: [[String: String]]? = [[String: String]]()
Nun diese extension hinzufügen. Hier wird das 2. Array filteredresults mit dem Filterergebnis gefüllt und festgelegt ob unsere Variable searching true oder false gesetzt wird. Logischerweise wird
seraching = false
gesetzt, wenn
filteredresults!.count == 0
Datensätze enthält.
extension ViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
       
        filteredresults = self.results!.filter ({
            
            $0["ASIN"]!.localizedCaseInsensitiveContains(searchText)

        })
        if(filteredresults!.count == 0){
            searching = false
        }else{
            searching = true
        }

        self.tableView.reloadData()

    }
}
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if (searching){
            return filteredresults!.count
        }else {
            return (results!.count)
        }
    }

Beim füllen der Felder in der Tableview Cell darauf achten, daß auch hier aus dem richtigen Array abgegriffen wird.

if (searching){

            cell.lblASIN.text = filteredresults![indexPath.row]["ASIN"]
        }
        else
        {
            cell.lblASIN.text = results![indexPath.row]["ASIN"]
        }

Hier solltest Du natürlich auch darauf achten, dass numberOfRowsInSection jeh nach Suchzustand korrekt zurückgeliefert wird.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if (searching){
            return filteredresults!.count
        }else {
            return (results!.count)
        }
    }