滚动

时间:2017-09-09 10:12:53

标签: ios objective-c uitableview

编辑: 我有一个从我的数据源数组填充的表视图。数据源数组被清空,因为来自服务的响应返回一个空数组,正在调用索引路径的行的平均时间单元。所以indexpath.row大于数据源数组计数

因此该应用程序正在崩溃。

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

数据源变空是不是问题。如果数据源变空,则不会显示任何行。问题是更新数据源并且UI更新变为并发。 所以

  • 首先,您必须更新数据源
  • 然后通过多种方式更新您的UI。执行批量更新或重新加载表视图
  • 如果要删除行,则在更新该特定行后从数据源中删除。
  • 最后,摘要总是首先更改数据源,然后更新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];
    }
}

希望这有帮助。