0
votes

Comment accéder à la valeur d'un élément de la liste des recherches

Comment accéder à des valeurs d'un élément particulier sur la liste faite avec foreach? Comme vous pouvez le constater, j'essayais quelque chose comme ceci (et de nombreuses autres options):

texte (élément [2] .nonoff? "ON": "OFF")

Je voulais vérifier la valeur de bascule d'un élément de liste 2ème (par exemple) et de mettre à jour le texte à l'écran indiquant si c'est allumé ou éteint.

Et je sais que c'est quelque chose à faire avec @Binding et je cherchais des exemples de cela et essayais Peu de choses, mais je ne peux pas faire fonctionner. Peut-être que c'est une question débutante. J'apprécierais que quelqu'un puisse m'aider.

mon contenuView: xxx

et listItemview: xxx < / p>


3 commentaires

L'approche appropriée serait d'avoir un modèle comme observableObject et de le transmettre entre les vues, de sorte que chacun pourrait modifier les propriétés liées, et vous pourriez les utiliser de naviguer entre des vues. ( @state est en fait conçu pour être seulement une vue seulement).


@Binding n'est-il pas conçu pour cela aussi? J'ai lu quelque part que ObservableObject est pour de nombreuses vues. Mais la liaison est si je veux passer des valeurs de variables entre seulement 2 vues. Je vais lire plus observableObject. Peut-être que j'ai mal compris quelque chose :)


@State est la liaison juste pour une vue.


3 Réponses :


1
votes

Je ne sais pas ce que vous souhaitez exactement réaliser, mais je vous ai fait un exemple de travail:

struct ListItemView: View {

    @ObservedObject var model: ListItemModel

    var body: some View {
        HStack {

            Text("99")
                .font(.title)

            Text("List item")

            Spacer()

            Toggle(isOn: self.$model.switchedOnOff) {
                Text("Label")
            }
            .labelsHidden()
        }
    }
}

class ListItemModel: ObservableObject {
    @Published var switchedOnOff: Bool = false
}

struct ContentView: View {

    @State private var onOff = false
    @State private var test = false

    @State private var list = [
        (id: 0, model: ListItemModel()),
        (id: 1, model: ListItemModel()),
        (id: 2, model: ListItemModel()),
        (id: 3, model: ListItemModel()),
        (id: 4, model: ListItemModel())
    ]

    var body: some View {
                NavigationView {
                    List {

                        HStack {
                            Text("Is 2nd item on or off? ")
                            Text(onOff ? "On" : "Off")
        //                  Text(item[2].onOff ? "On" : "Off")
                        }

                        ForEach(self.list, id: \.id) {item in
                            ListItemView(model: item.model)
                        }

                    }
                    .navigationBarTitle(Text("List"))
                }.onReceive(self.list[1].model.$switchedOnOff, perform: { switchedOnOff_second_item in
                    self.onOff = switchedOnOff_second_item
                })
    }
}


3 commentaires

Merci @krjw, ça marche. Je vois que vous avez créé un tableau. Je pense que c'est une bonne solution pour le produit final, où je suppose que je construirais un tableau de Coredata par exemple. Mais ... dans le but de construire un prototype rapide, est-ce qu'un moyen d'atteindre un effet similaire à l'aide de foreach ((1 ... 15), id: \ .fself) {élément dans ? Comment pourrais-je accéder à une valeur particulière à l'aide d'ID? J'essayais quelque chose comme texte (Self.Item [2]. $ ONOFF? "ON": "OFF") mais a échoué complètement


Je ne pense pas qu'il soit possible de le faire depuis que vous avez besoin des objets disponibles dans ContentView. Vous ne pouvez pas y accéder, sauf que vous créez une liaison à chaque enfant.


Oui, c'est le problème. Je ne sais pas comment utiliser la liaison avec toutes les lignes à l'aide de pourcheach ((1 ... 15). Vous pouvez voir mon exemple ci-dessous. Merci pour vos commentaires. J'apprends beaucoup. Peut-être que mes tentatives sont une impasse, Mais au moins je vais apprendre à ne pas le faire :)



0
votes

Je comprends que vous me dirigez d'utiliser ObservableObject. Et probablement c'est la meilleure façon d'aller avec le produit final. Mais je pense toujours à @Binding car j'ai juste besoin de passer des valeurs mieux entre 2 vues seulement. Peut-être que je ne comprends toujours pas la liaison, mais je suis venu à cette solution.

import SwiftUI

struct ListItemView: View {

//  @State private var onOff : Bool = false
    @Binding var onOff : Bool

    var body: some View {
        HStack {

            Text("99")
                .font(.title)

            Text("List item")

            Spacer()

            Toggle(isOn: self.$onOff) {
                Text("Label")
            }
            .labelsHidden()
        }
    }
}
  • Taping 1 bascule les changements. Je pense que c'est à cause de cette ligne: p>

    LISTITEMView (ONOFF: Self. $ ONOFF) P> LI>

  • Je ne peux toujours pas accéder à la valeur d'une seule rangée. Dans ma compréhension foreach (((1 ... 15), id: .elf) faire chaque ligne a leur propre identifiant, mais je ne sais pas comment y accéder plus tard. P> li> ul> p>


1 commentaires

C'est pourquoi je sauvegarde l'identifiant dans un tableau avec un modèle contenant la variable du commutateur. Vous pouvez également déplacer le htstack dans la boucle foreach et avoir une variable par identifiant



1
votes
import SwiftUI

struct ContentView: View {

        @State private var onOffList = Array(repeating: true, count: 15)

        var body: some View {
            NavigationView {
                List {

                    HStack {
                        Text("Is 2nd item on or off? ")
                        Text(onOffList[1] ? "On" : "Off")
                    }
                    ForEach((onOffList.indices), id: \.self) {idx in
                        ListItemView(onOff: self.$onOffList[idx])
                    }
                }
                .navigationBarTitle(Text("List"))
            }
        }
    }

    struct ListItemView: View {

        @Binding var onOff : Bool

        var body: some View {
            HStack {
                Text("99")
                    .font(.title)
                Text("List item")
                Spacer()
                Toggle(isOn: $onOff) {
                    Text("Label")
                }
                .labelsHidden()
            }
        }
    }

0 commentaires