Bonsoir les codeurs j’aimerai savoir s’il est possible d’appeler des fonctions de classe à partir de vues interactives comme le segmentedPicker ou le toggle dans swiftUI
Pour le moment pour appeler mes fonctions de classes je passe par des boutons ou OnTapeGesture
Par exemple dans le petit exemple ci-dessous je souhaite afficher un print dans la console en fonction du choix ? C’est possible ou pas ?
Merci de me donner des pistes de recherche.
Je souhaite pouvoir appeler des fonctions comme par exemple sort pour trier une liste en fonction du choix… par exemple
Merci
import SwiftUI
struct ContentView: View {
@State var selection:Int = 0
var pictogramme:[String] = ["abc", "figure.stand"]
var body: some View {
VStack {
Picker("", selection: $selection) {
ForEach(0..<pictogramme.count) {choix in
Image(systemName: pictogramme[choix])
}
}
.pickerStyle(SegmentedPickerStyle())
Image(systemName: (pictogramme[selection]))
.foregroundColor(selection == 0 ? Color.red : Color.blue)
.padding(10)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
C’est possible dans la closure exécutée pour le ForEach, par exemple si tu indiques une fonction à exécuter avec un print dedans. Mais c’est un peu une ruse, car, ici ce n’est pas conforme au protocole View, là, ce n’est pas possible avant que Self ne soit disponible, ailleurs, tel property Wrapper n’est pas accepté en dehors d’une View, etc. Et le plus beau, c’est que lorsque ça commence à devenir complexe, le compilateur ne peut pas vérifier les types dans un délai raisonnable et t’invite à fractionner ce qu’il t’a contraint à mettre ensemble auparavant… Il faut vraiment penser objet, ne pas se raccrocher à la vieille programmation algorithmique !
Bonjour tout ce que tu me dis, j’ai déjà eu, avant de poser la question maintenant je sèche.
Dans mon véritable exemple ici je cherche à remplacer mes deux boutons (rouge) qui me servent à trier ma liste soit par habitant soit par ordre alphabétique. Par un composant plus approprié.
Je vois pourquoi tu veux un print : ton code ne peut pas marcher. Tu demandes à ton picker de sélectionner un Int, et dans ton code tu lui renvoie une image. Ça ne va pas le faire. Après quoi, tu envoies une String vide puisque tu ne l’as pas changée dans ta variable d’état. sélection doit être de type chaîne pour que ça marche, pars d’une enum de String avec « abc » et « figure.stand », en argument de ton ForEach, mets (pictogrammes.allCases), et, dans ta closure retourne pictogramme.rawValue. Ça devrait marcher.
J’ai jeté un rapide coup d’oeil sur ton exemple. Je n’ai pas le temps de penser à ton problème avant ce WE. Mais j’ai quand même été surpris par ta source de données. Définir des centaines de données dans un tableau, directement dans le code ce n’est pas propre, ni évolutif.
Tu devrais te pencher sur l’utilisation des formats Plist ou JSON pour définir tes données, en DEHORS de l’application, dans des fichiers externes.
Le chapitre 6 du cours « Créer des applications iPhone avec SwiftUI (édition 2021) » traite de l’utilisation des fichiers JSON.
Edit : bien que le JSON soit toujours présenté comme un moyen de lire des données en provenance d’un serveur WEB, on peut s’en servir en local pour organiser les données et faciliter leurs saisies/mises à jour.
Je suis complètement d’accord avec toi sur le tableau de donnée en dur.
Je passe souvent uu temps à récupérer des données d’un json avec les struct decodable.
Le but de cet exemple c’est de traiter le gps sous swiftUI ainsi que le position sur une carte. voir le géocoding avec Swift
**Pour en revenir au données au départ j’avais 10 villes et puis j’ai trouvé une liste de ville sur internet j’aurai pas dû les ajouter…
Pour info pour les personnes qui décident de regarder l’exemple, mais l’utilisation de la position d’un point sur une carte. j’aurais dû le préciser avant pas bien malin de ma part.