Appeler des fonctions avec les vues interactives

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é.

Mon exemple ici mon exemple

le but de tout cela continuer mon apprentissage.

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.

Bonsoir draken,

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.

De plus rien n’est définitif.

Oui !

Depuis iOS 14, la fonction onChange() permet d’exécuter du code en réaction à un changement d’état d’une variable dans une vue SwiftUI.

https://developer.apple.com/documentation/swiftui/view/onchange(of:perform:)

Cela fonctionne avec n’importe quelle vue. Voici un exemple simple adapté à un Picker :

struct ContentView: View {
  
  @State var selection = 0
  
    var body: some View {
      VStack {
        Picker("", selection: $selection) {
          Text("Option 1").tag(1)
          Text("Option 2").tag(2)
          Text("Option 3").tag(3)
        }
        .padding(50)
        .onChange(of: selection,
                  perform: { value in
          print ("Choix : " + String(value))
        })

        }
      }
}

Lorsque le Picker change l’état de la variable selection, la closure du .onChange s’exécute, avec la valeur courante de sélection en paramètre.

ça fonctionne, j’ai testé avant de poster le code.

Choix : 2
Choix : 3
Choix : 1
Choix : 2

1 « J'aime »

Merci beaucoup pour cette exemple