UITableView开始/结束更新

时间:2013-08-28 08:00:01

标签: ios objective-c uitableview

在UITableView上使用- (void)beginUpdates- (void)endUpdates时,是否必须对调用内的数据源进行更改?

如果我有NSMutableArray名为dataSource的{​​{1}}驾驶tableView我可以这样做吗...

// edit the actual data first
[dataSource addObject:@"Blah"];

// now update the table
[self.tableView beginUpdates];

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic];

[self.tableView endUpdates];

或者是否有必要......

[self.tableView beginUpdates];

[dataSource addObject:@"Blah"];

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic];

[self.tableView endUpdates];

只是问,因为我有几个地方我正在更新,我可能会将公共代码带到一个函数。

但前提是我可以在更新电话之外更新。

4 个答案:

答案 0 :(得分:12)

在tableView beginUpdates / endUpdates之间更新数据源通常是个好主意。调用endUpdates后,操作系统将触发dataSource调用以获取节和行计数。如果此时数据源尚未更新,则可能会导致tableView不一致崩溃。

在某些情况下,在tableView beginUpdates / endUpdates调用之前更新数据源可能会有效,但是您必须确保在同一个线程和同一个运行循环中更新数据源。由于tableView更新必须在主线程上完成,这意味着您必须在主线程上进行数据源更新。

如果您更新数据源,并且不立即执行tableView更新(并执行旋转屏幕等操作),则可能会导致tableView不一致崩溃。

答案 1 :(得分:3)

我刚刚遇到过这个,并且不知道最好的方式是什么。但是,官方文档Table View Programming Guide确实提供了一些有关此问题的信息。在“批量插入和删除操作的示例”中,提到:

  

要在表视图中插入和删除一组行和节,请首先准备作为节和行的数据源的数组(或数组)。删除并插入行和部分后,将从此数据存储中填充生成的行和部分。

希望这会有所帮助。如果有人能够更好地解释它,我渴望更清楚地了解这一点。

答案 2 :(得分:2)

我一直使用第一种方法,它没有问题。只需确保在更改数据源后立即更新您的表格。

答案 3 :(得分:2)

没有规则声明数据源更新必须在开始/结束调用中。确保在更新数据源之后根据需要插入/删除行,以免长期破坏。