Archives de l’auteur Tobias Stephan

ParTobias Stephan

Modifier et adapter la ligne d’assistance de Shopware Servcie

Les informations de la ligne d’assistance téléphonique sont un module de texte. Les modules de texte peuvent être modifiés facilement via “Paramètres – Modules de texte”.
Pour éviter de devoir chercher éternellement le bon module de texte, il est recommandé de saisir simplement le mot “Hotline” dans le champ de recherche.

ParTobias Stephan

Pour des raisons que je ne peux pas expliquer, la toile (de Canvas) n’était tout simplement plus affichée dans un fichier SwiftUI. La recherche sur Google n’a pas aidé non plus. J’utilise Catalina 10.15. Après tout, ça marchait avant. Dans le même projet avec d’autres fichiers SwiftUI, l’aperçu a également été affiché. Je recommande donc une solution de contournement rapide. Copier + Coller est la solution ici. Il suffit de créer un nouveau fichier et de supprimer l’ancien. Insérez à nouveau le code source et pouf… la prévisualisation est de retour. Bien sûr, vous devez vérifier si la toile est montrée.

Avec le menu Éditeur + Toile, la toile peut être affichée ou masquée. Une autre possibilité est la
Combinaison de touches : ALT – Commandement – RETURN

Ici dans l’image, vous pouvez cliquer sur le symbole en haut à droite, 2ème en partant de la droite.

ParTobias Stephan

L’insertion d’un article dans le panier ne fonctionne pas

Aujourd’hui, un client appelle et se plaint qu’il ne peut pas mettre un article dans le panier… parce que les autres commandes affluent constamment, vous pensez que ce n’est pas le magasin. Eh bien peut-être que le client fait une erreur “stupide”… loin de là… le client avait raison ! La solution était très simple ! La boutique était accessible via http : ainsi que via la page cryptée SSL. Une redirection automatique vers https://www.leckerstecker.de a apporté la solution. Parfois, cela peut aussi être simple.

L’appel habituel se fera certainement via un lien vers un moteur de recherche… mais ici, le client a en fait choisi la voie directe. Je ne veux pas penser au nombre d’entreprises que nous avons ratées à cause de cette petite erreur.

ParTobias Stephan

SwiftUI TableView ListView example sample code project

À mon avis, SwiftUI est un jalon absolu dans le développement de logiciels. Il faut certes du temps pour s’habituer à cette nouvelle façon de se développer, mais le temps que vous gagnez sur d’autres projets peut être bien investi. Vous trouverez ici un exemple simple de SwiftUI TableView. L’exemple de projet peut être téléchargé et utilisé librement. Le projet ne contient délibérément pas plus, afin que les fonctions essentielles contribuent à la compréhension.

Download XCode Sample Project.

Il est assez impressionnant de voir le peu de lignes de code que l’on peut créer un TableView / ListView avec SwiftUI. Il suffit de créer un nouveau projet et de s’assurer que SwiftUI est sélectionné comme interface utilisateur.

SwiftUI Interace selektieren

Bien sûr, il vous faut encore 3 images pour cet exemple, elles sont également incluses dans l’exemple de projet.

Assets für die Bilder in der Liste

Le code réel du projet.

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)
        }
    }
}

Voici le code du tableau sous-jacent. Pour cela, j’ai créé une vue SwiftUI avec le nom 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")
]
ParTobias 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()
    }
}
ParTobias 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..<str.endIndex
        print("Range: " + str[rangeStartToEnd])  // "Hello, playground"

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

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..<str.index(before: str.endIndex)
str[range]

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..<end
str[range]

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<S: StringProtocol>(of string: S, options: String.CompareOptions = []) -> Index? {
        range(of: string, options: options)?.lowerBound
    }
    func endIndex<S: StringProtocol>(of string: S, options: String.CompareOptions = []) -> Index? {
        range(of: string, options: options)?.upperBound
    }
    func indices<S: StringProtocol>(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<S: StringProtocol>(of string: S, options: String.CompareOptions = []) -> [Range<Index>] {
        var result: [Range<Index>] = []
        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
    }
}
ParTobias Stephan

Application iPhone pour l’imprimante Dremel 3d45 3d software

Nouvelle version 1.15 du 02. mai 2020
L’application pour les imprimantes Dremel est maintenant complètement traduite en 5 langues. Les retours d’information fournis par l’imprimeur ont également été traduits. L’application est disponible en anglais, allemand, français et italien.

Download via Apple App Store

Nouvelle version 1.14 datée du 23 avril 2020
Après la mise à jour vers la version 13.4.1 de l’IOS, cela a provoqué le plantage de l’application pour certains utilisateurs. Le problème est résolu avec cette version.


Avec cette application, vous pouvez regarder jusqu’à 3 imprimantes Dremel 3D45 créer vos objets 3D. De plus, il y a des messages de statut détaillés, comme un calcul de temps jusqu’à ce que l’objet soit terminé ou une possibilité d’annuler une impression. Ceci est particulièrement utile si vous voulez vérifier d’un seul coup d’œil si tout va bien pendant le processus d’impression. L’avantage est que vous pouvez intervenir à temps pour mettre l’objet au monde dans un état parfait. Il suffit de saisir l’adresse IP interne de l’appareil sous les paramètres et vous êtes prêt à partir. Avec les réglages de votre Dremel 3D45, vous pouvez définir une adresse IP locale ou utiliser pour cela l’adresse IP V4 attribuée automatiquement. Vous trouverez l’adresse IP de votre Dremel 3D45 dans les réglages. L’affichage d’état contient des informations sur la progression, la température de la buse, le temps, les portes ouvertes ou fermées, la température de la plate-forme, la température de la chambre, le nom du fichier d’impression et le type de fichier.

Les informations d’état actuelles telles que le temps d’achèvement prévu de l’objet ainsi qu’un indicateur de progression en pourcentage ou la température actuelle de la buse. La porte ou le couvercle sont-ils fermés ? L’application l’affiche. Température de la chambre ou de la plate-forme, avec cette application vous êtes à jour. Vous pouvez maintenant utiliser le bouton Annuler pour annuler une impression directement depuis l’application.

L’application pour le Dremel 3D45 – le statut et le contrôle de votre imprimante 3D !