0

我正在尝试为我的 tableview 实现 UITableViewViewDiffableDataSource。我的代码编译得很好,但是我第一次对其应用快照时一直遇到此错误,并出现以下错误:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:section < [_state.dataSourceSnapshot numberOfSections]”

这是我的代码:

BaseDisplayManager

class BaseDisplayManager: NSObject, UITableViewDelegate, BaseDiffableDataSourceDelegate {
   var tableData = [[BaseViewModelProtocol]]()
   var sections: [DiffableSection] = []
...

   func setupDiffableDataSource(forTableView tableView: UITableView) {
      dataSource = BaseDiffableDataSource(tableView: tableView, cellProvider: { (tableView, indexPath, model) -> UITableViewCell? in
          guard let model = model as? BaseViewModelProtocol else { return nil }
          let cell = tableView.dequeueReusableCell(withIdentifier: model.cellIdentifier, for: indexPath)
          (cell as? TableViewCell)?.model = model
          (cell as? NoSwipeTableViewCell)?.model = model
          return cell
      })

      dataSource.delegate = self
   }

   func reloadSnapshot() {
      var snapshot = NSDiffableDataSourceSnapshot<AnyHashable, AnyHashable>()
      snapshot.appendSections(sections.map { $0.sectionIdentifier() })
      sections.forEach { [weak self] section in
          guard let items = self?.tableData[section.sectionIndex()] as? [AnyHashable] else { return }
          snapshot.appendItems(items, toSection: section.sectionIdentifier())
      }
    
      dataSource.apply(snapshot, animatingDifferences: true)
   }

可区分部分

protocol DiffableSection {
  func sectionIndex() -> Int
  func sectionIdentifier() -> AnyHashable
}

BaseDiffableDataSource

protocol BaseDiffableDataSourceDelegate: class {
   func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
   func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
   func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool
   func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath)
}

class BaseDiffableDataSource: UITableViewDiffableDataSource<AnyHashable, AnyHashable> {

   weak var delegate: BaseDiffableDataSourceDelegate! = nil

   override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return delegate.tableView(tableView, canEditRowAt: indexPath)
   }

   override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    return delegate.tableView(tableView, commit: editingStyle, forRowAt: indexPath)
   }

   override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
    return delegate.tableView(tableView, canMoveRowAt: indexPath)
   }

   override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    return delegate.tableView(tableView, moveRowAt: sourceIndexPath, to: destinationIndexPath)
   }
}

}

4

1 回答 1

1

我在 ViewController 中遇到了同样的问题,它是UITableViewController.

对我来说,我之前正在配置我的数据源并在viewWillAppear()AND 调用中应用快照super.viewWillAppear()。删除超级电话就可以了。

于 2021-09-06T14:34:26.363 回答