我遇到了来自 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)
}
}
答案 0 :(得分:0)
我目前使用的解决方法是在父视图中有一个占位符根 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
}
但这不是理想的方式......