2011-04-05 48 views
7

我有一个UITableViewController管理iPad应用程序中的UITableView对象。表格视图与其他对象的相当复杂的星座相关联。我有一个问题,当我要求它重新加载一行如下:UITableView的reloadRowsAtIndexPaths:(NSArray *)indexPaths无法重新加载,除非您调用它两次?

//indexPath is an NSIndexPath with indexes 0 and 0. At the moment, this is the only cell in the table view. 
NSArray *array = [NSArray arrayWithObject:indexPath]; 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; 

问题是行不重新加载。从来没有回调cellForRowAtIndexPath。

疯狂的事情是,如果我叫reloadRowsAtIndexPaths两次,第二次通话不会触发重装:

//indexPath is an NSIndexPath with indexes 0 and 0. At the moment, this is the only cell in the table view. 
NSArray *array = [NSArray arrayWithObject:indexPath]; 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; // does not reload 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; // does reload 

我想知道是否有人曾经遇到过这样的错误,如果是这样,究竟是什么原因?

+0

你在做一些后台线程? – Daniel 2011-04-05 19:44:59

+0

有一个测试用例吗? – 2011-04-06 22:01:15

+0

主线程。如果通过“测试案例”,你的意思是一个简单的例子,说明同样的事情,没有我没有,我希望我做到了。 – 2011-04-09 02:08:48

回答

6

reloadRowsAtIndexPaths:...只有当包裹其间的呼叫工作:

- (void)beginUpdates; 
- (void)endUpdates; 

之外的是,行为是不确定的。 (正如你所发现的,相当不可靠)。

编辑:引用的相关部分“表视图编程指南iPhone OS”:

要动态行和部分的一批插入和删除,调用由定义动画块中插入和删除方法连续调用beginUpdates和endUpdates。如果您不在此块中调用插入和删除方法,则行和部分索引可能无效。 beginUpdates ... endUpdates块不可嵌套。

在块结束时 - 也就是endUpdates返回后 - 表视图查询其数据源并像平常一样查询行和段数据。因此,应该更新支持表视图的集合对象以反映新的或删除的行或部分。

reloadSections:withRowAnimation:和reloadRowsAtIndexPaths:withRowAnimation:在iPhone OS 3.0中引入的方法与上面讨论的方法有关。它们允许您请求表视图重新加载特定部分和行的数据,而不是通过调用reloadData加载整个可见表视图。

+0

你确定吗?它没有明确说在文档中... – Daniel 2011-04-05 19:55:27

+1

这个问题去年杀了我一个星期......并且它确实说了,但它在表格视图编程指南中隐藏**,而不是参考文档。 – amattn 2011-04-05 19:57:21

+0

添加了来自苹果文档的相关部分。他们提到“与上面讨论的方法有关”。这对于英语语言来说相当模糊,但实际上这意味着reloadRows只能在beginUpdates和endUpdates之间起作用。 – amattn 2011-04-05 20:06:39

2

我知道这个话题有点古怪,但我遇到了同样的问题和简单的修复。我有一个表视图,当我调用reloadData和/或reloadRowsAtIndexPaths时,tableview方法cellForRowAtIndexPath不会触发。

事实证明,我没有在Interface Builder中连接我的tableview IBOutlet - 一旦这个连接被按预期触发了一切。它总是这些小东西...

此外,像其他人所说的,如果您只需要一个调用,则将其封装在begin/endUpdates中是没有必要的。