微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI 列表:NSInternalInconsistencyException / 行数无效

如何解决SwiftUI 列表:NSInternalInconsistencyException / 行数无效

我有一个视图 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,我不知道如何解决

*** 断言失败 -[_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] *** 由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第 0 节中的行数。 更新后的现有部分 (9) 必须等于 更新前包含在该节中的行 (9),加号或减号 从该部分插入或删除的行数(插入 0, 4 删除)和加减移入或移出的行数 该部分(0 移入,0 移出)。'

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

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

更新:(提供更多背景信息)

涉及的视图有3个:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。