【发布时间】: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