我正在使用 Swift 和 RxSwift 开发一个 iOS 应用程序,特别是利用
RxTableViewSectionedReloadDataSource
来管理我的 UITableView
数据绑定。我没有使用DataSourceDelegate
。相反,我会被动地管理数据。有时,当我的数据源暂时变空时,我会遇到崩溃并显示以下错误消息:
Assertion failure in NSInteger
_UITableViewRowDataNumberOfRowsInSection(UITableViewRowData *__unsafe_unretained, NSInteger)(),
UITableViewRowData.m:1761
*** Terminating app due to uncaught exception:
'NSInternalInconsistencyException', reason: 'Requested the number of rows for section (-1) which is out of bounds.'
当我尝试刷新或滚动 UITableView 时,似乎会发生此错误。当我的节列表为空或数据源快速更新时,如何处理或防止发生此异常?
我使用 RxSwift 的 RxTableViewSectionedReloadDataSource 实现了反应式数据绑定来管理 UITableView 中的数据。以下是将数据绑定到表视图的方法:
fileprivate func bindViewModel() {
viewModel?.sectionList
.debug("Section List Binding")
.observe(on: MainScheduler.asyncInstance)
.filter { !$0.isEmpty }
.catch { error in
print("Error in binding section list: \(error)")
return .empty()
}
.bind(to: tableView.rx.items(dataSource: temporaryExtraDataSource()))
.disposed(by: disposeBag)
}
此外,我在数据源中添加了安全检查,以处理索引路径可能超出有效范围的情况,特别是当sectionList为空,但返回块甚至没有执行时。
func temporaryExtraDataSource() -> RxTableViewSectionedReloadDataSource<TemporaryExtraSectionModel> {
return RxTableViewSectionedReloadDataSource<TemporaryExtraSectionModel>(
configureCell: { dataSource, tableView, indexPath, _ in
guard indexPath.section >= 0, indexPath.section < dataSource.sectionModels.count,
indexPath.row >= 0, indexPath.row < dataSource.sectionModels[indexPath.section].items.count else {
return UITableViewCell() // Safe fallback
}
switch dataSource[indexPath] {
case let .contentListSectionItem(control):
let cell = tableView.cellWithIdentifier(cell: TemporaryExtraContentCell.self)
let contents = Utils.instance.getContentData(control: control)
cell.delegate = self
cell.data.accept(contents)
return cell
}
}
)
}
我期望表视图能够优雅地处理空部分,以防止当数据源暂时为空或部分快速更新时发生任何崩溃。但是,当部分列表为空并且发生交互(如滚动)时,我仍然遇到崩溃。崩溃表明请求某个部分的行数时出现“越界”错误。
根据提供的信息,我认为您的问题出在
.filter { !$0.isEmpty }
线上。
如果没有item,需要让table view知道,否则无法正常更新。