SwiftUI 使用链接列表动态弹出 NavigationLink

sim*_*bac 1 swiftui

我想从代码中弹出一个 NavigationLink。我关注了这篇文章,它适用于一个链接(https://swiftui-lab.com/bug-navigationlink-isactive/)。但是,在使用链接列表时,必须为每个 NavigationLink 使用单独的布尔值。

所以我认为这样做的聪明方法是使用一个 EnvironmentObject ,它为每个 ChildView 保存一个带有布尔值的字典:

class Navigation: ObservableObject{
    @Published var show:[UUID:Bool] = [:]
}
Run Code Online (Sandbox Code Playgroud)

假设我们想要一个可变数量的子视图(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")
        })
    }
}

Run Code Online (Sandbox Code Playgroud)

Vla*_*lad 5

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")
        })
    }
}
Run Code Online (Sandbox Code Playgroud)