微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

动态列表和自定义导航栏中的导航链接不会弹出

如何解决动态列表和自定义导航栏中的导航链接不会弹出

我遇到了来自 NavigationLink 的非常奇怪的行为。

当我将列表外部的 NavigationLink 选择设置为 nil 时,视图会弹出。如果我从 list 内部做同样的事情,它就不起作用。即使我在子视图中并将其从 list 外部设置为变量,然后设置为 nil 它也能工作。子视图似乎以某种方式忘记了 NavigationLink 中的 list

带有 @Environment(\.presentationMode) 的此类解决方案 (NavigationLink tag and selection not working as expected) 在自定义 NavigationBar 中不起作用,或者至少我不知道如何。

在这里错过了什么?非常感谢任何帮助:)

应用入口:

struct MainView : View {
    @Observedobject var dbhandler = DBhandler()
    var body: some View {
        vstack{
            Header()
                .frame(height: 50)
            
            NavigationDummy()
        }.environmentObject(dbhandler)
    }
}

导航和模型的环境对象:

class DBhandler: ObservableObject {
    @Published var navSelection : String? = nil
}

struct DummyObject {
    var year: Int
    var names: [String]
}

自定义导航栏:

struct Header: View{
    @EnvironmentObject var dbhandler: DBhandler
    var body: some View{
        HStack{
            Button {
                dbhandler.navSelection = nil
            } label: {
                Text("Back")
            }
            Text("Current view: \(dbhandler.navSelection ?? "Empty")")
        }
    }
}

父视图:

struct NavigationDummy: View {
    @EnvironmentObject var dbhandler: DBhandler
    var dummyList : [DummyObject] = [DummyObject(year: 2020,names: ["Jo","Alex"]),DummyObject(year: 2019,names: ["Mike","Nancy"])]
    
    var body: some View {
        NavigationView{
            vstack{
                List{
                    ForEach(dummyList,id:\.year){ object in
                        Section(header: Text(String(object.year))){
                            ForEach(object.names,id:\.self) {name in
                                Button {
                                    dbhandler.navSelection = name
                                } label: {
                                    vstack{
                                        Text(name)
                                        NavigationLink(destination: ChildView(),tag: name,selection: $dbhandler.navSelection) {
                                            EmptyView()
                                        }.hidden()
                                    }
                                }
                            }
                        }
                    }
                }
                
                NavigationLink(destination: ChildView(),tag: "OutsideList",selection: $dbhandler.navSelection) {
                    EmptyView()
                }
                
                Button {
                    dbhandler.navSelection = "OutsideList"
                } label: {
                    Text("Detail view from outside list")
                }

            }
        }
    }
}

子视图:

struct ChildView: View {
    @EnvironmentObject var dbhandler: DBhandler
    
    var body: some View {
        vstack{
            
            Button {
                dbhandler.navSelection = "OutsideList"
            } label: {
                Text("Outside list")
            }
            
            Button {
                dbhandler.navSelection = "Jo"
            } label: {
                Text("Inside list")
            }
        }.navigationBarHidden(true)
    }
}

解决方法

我目前使用的解决方法是在父视图中有一个占位符根 NavigationLink,如下所示:

NavigationLink(destination: EmptyView(),tag: "Root",selection: self.$dbhandler.navSelection,label: {
               EmptyView()
               }).hidden()

然后在标题中执行此操作以弹出:

    dbhandler.navSelection = "Root"
    
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
        dbhandler.navSelection = nil
    }

但这不是理想的方式......

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。