编辑: 我有一个从我的数据源数组填充的表视图。数据源数组被清空,因为来自服务的响应返回一个空数组,正在调用索引路径的行的平均时间单元。所以indexpath.row大于数据源数组计数
因此该应用程序正在崩溃。
如何解决这个问题?
答案 0 :(得分:1)
数据源变空是不是问题。如果数据源变空,则不会显示任何行。问题是更新数据源并且UI更新变为并发。 所以
答案 1 :(得分:0)
在numberOfRowsInSection方法中,第一个检查数组是否为空。像这样:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (arrayName.count>0){
return arrayName.count;
}
}
答案 2 :(得分:0)
如果数据源在滚动时发生更改,则将新数据存储在缓冲区中,然后仅在滚动完成后才从缓冲区更改数据源。通过这种方式,您可以防止崩溃。
使用以下代码来实现此目的。
@property(nonatomic) BOOL isScrolling;
@property(nonatomic) NSArray *dataSource;
@property(nonatomic) NSArray *bufferDataSource;
- (void)updateDatasource:(NSArray *)newData {
if (self.isScrolling) {
self.bufferDataSource = newData;
} else {
self.dataSource = newData;
[self.tableView reloadData];
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (!decelerate) {
[self scrollingFinished];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[self scrollingFinished];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {
[self scrollingStarted];
}
- (void)scrollingStarted {
self.isScrolling = YES;
}
- (void)scrollingFinished {
self.isScrolling = NO;
if (self.bufferDataSource != nil) {
self.dataSource = self.bufferDataSource;
self.bufferDataSource = nil;
[self.tableView reloadData];
}
}
希望这有帮助。