【问题标题】:SwiftUI dynamically pop NavigationLink with a list of linksSwiftUI 动态弹出带有链接列表的 NavigationLink
【发布时间】:2019-10-24 14:55:20
【问题描述】:

我想从代码中弹出一个 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")
        })
    }
}

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    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")
            })
        }
    }
    

    【讨论】:

    • 这很棒。谢谢!
    猜你喜欢
    • 2019-11-23
    • 2021-08-13
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多