使用过滤器的SwiftUI列表,遇到状态更新问题

时间:2020-03-08 14:11:19

标签: swiftui

很难解释问题所在。仅运行代码,编辑其中一个模型,然后查看其详细信息视图,这可能是最简单的。但我会尽力解释:)

我有一个视图,其中显示计算机列表,该列表根据计算机模型中的字段分为两部分。您可以点击计算机以显示其详细信息屏幕,该屏幕具有用于编辑计算机的按钮。

当您编辑isLaptop布尔值时,会发生问题。假设您打开iMac,将isLaptop更改为true,然后保存表单。即使现在应该说“这是一台笔记本电脑”,详细信息屏幕仍显示“这不是笔记本电脑”。弹出列表视图时,您会看到列表已正确更新,并且iMac已移至“笔记本电脑”部分。

我的猜测是,当我编辑isLaptop字段时,DetailView自从ContentView重新创建其主体以来,基本上就变成了一个孤儿,该列表由于过滤器而更改,现在{ {1}}不再“链接”到屏幕上已有的内容。我以为在DetailView上添加.id(computer.id)会有所帮助,但遗憾的是没有。

因此,如何使此工作按预期进行,以便具有两个部分的过滤列表可以工作,但是当您更改过滤的字段时,子视图也会按预期正确地重新创建?

NavigationLink

1 个答案:

答案 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在模拟器上表现不佳,但是在设备上很好,而我想出的最好的是?‍♂️