在uitableview中插入行和重新加载

时间:2017-10-30 09:28:41

标签: ios uitableview

我在向tableview插入行时遇到崩溃问题。当分页重新加载(tableview的非常快速滚动)表格视图和插入广告行时,会发生这种情况。

广告插入方式

[self.news insertObject:adStory atIndex:index];
NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]];
[[self tableView] beginUpdates]; 
[[self tableView] insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
[[self tableView] endUpdates];

OperationDidfinish

[_tableView relaoddata];

崩溃日志

***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的行数无效。更新后的现有部分中包含的行数(45)必须等于更新前该部分中包含的行数(43),加上或减去从该部分插入或删除的行数(插入1个,删除0个),加上或减去移入或移出该部分的行数( 0移入,0移出)。'

    *** First throw call stack:
  (0   CoreFoundation                      0x000000010e8ebb0b __exceptionPreprocess + 171

1   libobjc.A.dylib                     0x000000010e357141 objc_exception_throw + 48

2   CoreFoundation                      0x000000010e8efcf2 +[NSException raise:format:arguments:] + 98
3   Foundation                          0x00000001088413b6 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
4   UIKit                               0x000000010c8d78e8 -[UITableView _endCellAnimationsWithContext:] + 16362
5   UIKit                               0x000000010c8ee9cc -[UITableView _updateRowsAtIndexPaths:updateAction:withRowAnimation:] + 329

2 个答案:

答案 0 :(得分:0)

必须在main thread上执行任何与UI相关的更改。在background thread上进行UI更改可能会导致更改速度变慢。

试试这个,

dispatch_async(dispatch_get_main_queue(), ^{
        [self.news insertObject:adStory atIndex:index];
        NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]];
        [[self tableView] beginUpdates];
        [[self tableView] insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
        [[self tableView] endUpdates];
    });

如果需要,这会将更改移至main thread

答案 1 :(得分:0)

请确保委托方法insertRowsAtIndexPaths中返回的行数 等同于endUpdatessetTimeout之后的等价物。例如,如果之前的numberOfRows为4且您插入一行,则numberOfRows应返回4 + 1。否则它将在endUpdate中不匹配。

以下崩溃日志仅描述了。

  

***由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'无效更新:第0部分中的行数无效。更新后现有部分中包含的行数(45)必须等于更新前该部分中包含的行数(43),加上或减去从该部分插入或删除的行数(插入1个,删除0个)以及加上或减去行数移入或移出该部分(0移入,0移出)。'