Я хочу открыть NavigationLink из кода. Я следовал этой статье, и она работает для одной ссылки (https://swiftui -lab.com / bug-navigationlink-isactive / ). Однако при использовании списка ссылок необходимо использовать отдельное логическое значение для каждого NavigationLink.
Так что я подумал, что разумный способ сделать это с помощью EnvironmentObject, который содержит словарь с логическим значением для каждого ChildView:
class Navigation: ObservableObject{
@Published var show:[UUID:Bool] = [:]
}
Допустим, мы хотим иметь дочерние представления с переменным числом (типа MyObject).
Что необходимо изменить, чтобы заставить его работать?
struct MyObject:Identifiable{
var id = UUID()
var name:String
}
struct ContentView: View {
@EnvironmentObject var navigation:Navigation
var objects = [MyObject(name: "view1"), MyObject(name: "view2"), MyObject(name: "view3")]
init() {
for object in objects{
self.navigation.show[object.id] = false
}
}
var body: some View {
NavigationView{
VStack{
ForEach(objects, id:\.self.id){ object in
NavigationLink(destination: Child(object:object), isActive: self.$navigation.show[object.id], label: {
Text(object.name)
})
}
}
}
}
}
struct Child: View {
@EnvironmentObject var navi:Navigation
var object:MyObject
var body: some View {
Button(action:{self.navi.show[self.object.id] = false}, label: {
Text("back")
})
}
}