web-dev-qa-db-fra.com

SWIFTUI - Liste / foreach en combinaison avec NavigationLink et Isactive ne fonctionne pas correctement

J'essaie de faire une navigation dans une liste ou une boucle foreach à Swiftui. Malheureusement, je reçois un comportement vraiment étrange (par exemple, en cliquant sur Leo, il ouvre Karl, ouvrant également des points Max à Karl.

J'ai déjà compris que cela est lié à l'attribut "Isactive" dans la navigationLink. Malheureusement, j'en ai besoin pour atteindre un ce comportement ici: https://i.stack.imgur.com/g0bfz.gif qui est également demandé ici Swiftui - Navigation nichéeView: revenir en arrière Pour racine .

J'ai également essayé de travailler avec la sélection et l'attribut de balises, mais je n'ai pas pu atteindre la mécanique "Retour à la racine".

Voici l'exemple:


import SwiftUI


struct Model: Equatable, Hashable {
    var userId: String
    var firstName: String
    var lastName: String
}


struct ContentView: View {
    
    @State var navigationViewIsActive: Bool = false
    
    var myModelArray: [Model] = [
        Model(userId: "27e880a9-54c5-4da1-afff-05b4584b1d2f", firstName: "Leo", lastName: "Test"),
        Model(userId: "1050412a-cb12-4160-b7e4-2702ab8430c3", firstName: "Max", lastName: "Test"),
        Model(userId: "1050412a-cb12-4160-b7e4-2702ab8430c3", firstName: "Karl", lastName: "Test")]
    
    var body: some View {
        NavigationView {
            List(myModelArray, id: \.self) { model in
                NavigationLink(destination: secondView(firstName: model.firstName), isActive: $navigationViewIsActive){ Text(model.firstName) }
            }
            .listStyle(PlainListStyle())
        }
    }
}

struct secondView: View {
    
    @State var firstName: String
    
    var body: some View {
        NavigationView {
            Text(firstName)
                .padding()
        }
    }
    
}

Merci!

9
SwiftUIRookie

Vous n'avez pas besoin isactif dans ce cas, il suffit d'utiliser

List(myModelArray, id: \.self) { model in
    NavigationLink(destination: secondView(firstName: model.firstName)) { 
       Text(model.firstName) 
    }
}

et vous n'avez pas utilisé NavigationView en deuxième vue, c'est-à-dire.

struct secondView: View {
    
    var firstName: String   // you don't need state here as well
    
    var body: some View {
        Text(firstName)
            .padding()
    }
}
2
Asperi