在uitableview中插入行并重新加载

Posted

技术标签:

【中文标题】在uitableview中插入行并重新加载【英文标题】:inserting row and reload in uitableview 【发布时间】:2017-10-30 09:28:40 【问题描述】:

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

广告插入方式

[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

【问题讨论】:

请发布一些崩溃日志。 添加了崩溃日志。请检查 什么是relaoddata?基本上不要同时调用insertRows.../deleteRows...reloadDatainsertRows... 确实更新了 UI。而beginUpdates / endUpdates在执行单个insert/delete/move操作时没有任何作用。 relaoddata 在另一个函数中。从 Api 获取下一个故事列表后。 【参考方案1】:

请确保在委托方法- (NSInteger)numberOfRowsInSection:(NSInteger)section; 中返回的行数 相当于,在你insertRowsAtIndexPathsendUpdates 之后。例如,如果较早的 numberOfRows 为 4 并且您插入一行,则 numberOfRows 应该返回 4+1。否则会在 endUpdate 中不匹配。

以下崩溃日志仅描述了这一点。

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

【讨论】:

是的。这就是问题所在。我错过了在添加额外加载单元时处理广告计数的问题。【参考方案2】:

任何与 UI 相关的更改都必须在 main thread 上执行。在 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

【讨论】:

以上是关于在uitableview中插入行并重新加载的主要内容,如果未能解决你的问题,请参考以下文章

UITableView中默认重新加载后如何记住选择的行并维护它们?

TableView:是不是可以在不重新加载 tableview 或部分的情况下删除现有行并插入新行?

UITableView 重新加载部分时的内容插入更改

UITableView 两次重新加载数据,但没有正确显示数据

向 UItableview 添加行并在 Viewcontroller 之间传递数据

为什么我的UITableView重新加载其所有节标题?