很难解释问题所在。仅运行代码,编辑其中一个模型,然后查看其详细信息视图,这可能是最简单的。但我会尽力解释:)
我有一个视图,其中显示计算机列表,该列表根据计算机模型中的字段分为两部分。您可以点击计算机以显示其详细信息屏幕,该屏幕具有用于编辑计算机的按钮。
当您编辑isLaptop布尔值时,会发生问题。假设您打开iMac,将isLaptop更改为true,然后保存表单。即使现在应该说“这是一台笔记本电脑”,详细信息屏幕仍显示“这不是笔记本电脑”。弹出列表视图时,您会看到列表已正确更新,并且iMac已移至“笔记本电脑”部分。
我的猜测是,当我编辑isLaptop字段时,DetailView
自从ContentView
重新创建其主体以来,基本上就变成了一个孤儿,该列表由于过滤器而更改,现在{ {1}}不再“链接”到屏幕上已有的内容。我以为在DetailView
上添加.id(computer.id)
会有所帮助,但遗憾的是没有。
因此,如何使此工作按预期进行,以便具有两个部分的过滤列表可以工作,但是当您更改过滤的字段时,子视图也会按预期正确地重新创建?
NavigationLink
答案 0 :(得分:1)
好的,我设法找到一种解决方法:
struct ContentView: View {
@EnvironmentObject private var store: Store
@State private var selected: Int?
var body: some View {
NavigationView {
VStack {
List {
Section(header: Text("Laptops")) {
ForEach(store.computers.filter { $0.isLaptop == true }) { computer in
Button(computer.name) {
self.selected = computer.id
}
}
}
Section(header: Text("Other computers")) {
ForEach(store.computers.filter { $0.isLaptop == false }) { computer in
Button(computer.name) {
self.selected = computer.id
}
}
}
}
ForEach(store.computers) { computer in
NavigationLink(destination: DetailView(computer: computer), tag: computer.id, selection: self.$selected) {
EmptyView()
}
}
}
.listStyle(GroupedListStyle())
.navigationBarTitle("Computers")
}
}
}
可悲的是,这些类型的NavigationLink在模拟器上表现不佳,但是在设备上很好,而我想出的最好的是?♂️