【问题标题】:Navigationlink within dynamic List and custom navigationbar not popping back动态列表和自定义导航栏中的 Navigationlink 不会弹回
【发布时间】:2021-03-18 10:33:08
【问题描述】:

我在NavigationLink 遇到了一个非常奇怪的行为。

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

带有@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)
    }
}

【问题讨论】:

    标签: foreach swiftui swiftui-list swiftui-navigationlink


    【解决方案1】:

    我使用的当前解决方法是在父视图中有一个占位符根 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
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 2012-03-12
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多