我想从代码中弹出一个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")
})
}
}
答案 0 :(得分:3)
NavigationLink
导航到的视图具有名为presentationMode
的环境变量集。通过此变量,您可以通过编程方式将子视图弹出回到父视图。
因此,不必跟踪所有显示状态,我们可以将Child结构简化为以下形式:
struct Child: View {
@Environment(\.presentationMode) private var presentation
var object:MyObject
var body: some View {
Button(action:{ self.presentation.wrappedValue.dismiss() }, label: {
Text("back")
})
}
}