3

我有一个视图CountriesListScreen,我正在向它传递一个项目列表。

struct CountriesListScreen: View {
  var listItems: CountriesListItems

  var body: some View {
    VStack {

      Section(header: CountriesListHeader()) {
        ForEach (listItems, id: \.name) { item in
            ...
        }
      }

    }
  }

}

这就是我正在做的事情:

  • 我首先显示CountriesListScreen,有 9 个列表项
  • 然后我转到另一个视图,在那里我执行一个操作,它修改了项目列表
  • 然后我返回CountriesListScreen,传递新的 listItems 对象,该对象现在有 5 个项目而不是 9 个

我得到了这个NSInternalInconsistencyException,我不知道如何解决:

*** Assertion failure in -[_TtC7SwiftUIP33_BFB370BA5F1BADDC9D83021565761A4925UpdateCoalescingTableView _Bug_Detected_In_Client_Of_UITableView_Invalid_Number_Of_Rows_In_Section:], UITableView.m:2471 2021-06-11 18:22:55.908398+0300 iosApp[6525:5802640] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason :'无效更新:第0节中的行数无效。更新后现有节中包含的行数(9)必须等于更新前该节中包含的行数(9),加或减从该部分插入或删除的行数(0 插入,4 删除)加上或减去移入或移出该部分的行数(0 移入,0 移出)。

如果我理解正确,SwiftUI 会触发错误,因为它意识到项目列表已更改,而视图中并未发生更改。

如何安全地使用不同数量的项目重新绘制列表,而不会触发此错误?

更新:(提供更多上下文)

涉及的观点有3种:

  1. 的父级CountriesListScreen,我们称之为它MainView,它引用了一个ObservedObject,它listItems作为一个属性
  2. CountriesListScreenlistItems,它从其父级接收作为参数
  3. 第三个视图,它执行修改listItems(以及因此ObservedObject)的操作,触发更新MainView
4

0 回答 0