UITableView的reloadRowsAtIndexPaths:(NSArray *)indexPaths除非你调用它两次,否则无法重新加载?

时间:2011-04-05 19:38:54

标签: iphone ios ipad uitableview reload

我有一个UITableViewController在iPad应用程序中管理UITableView对象。表视图与其他对象的相当复杂的星座相关联。当我要求它按如下方式重新加载时,我遇到了问题:

//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

我想知道是否有其他人遇到过这样的错误,如果有的话,原因是什么?

2 个答案:

答案 0 :(得分:6)

reloadRowsAtIndexPaths:...仅在调用以下内容时有效:

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

除此之外,行为未定义。 (正如你所发现的,相当不可靠)。

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

  

要为行和节的批量插入和删除设置动画,请在连续调用beginUpdates和endUpdates定义的动画块中调用插入和删除方法。如果不在此块中调用插入和删除方法,则行和节索引可能无效。 beginUpdates ... endUpdates块不可嵌套。

     

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

     

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

答案 1 :(得分:2)

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

事实证明,我没有在Interface Builder中连接我的tableview IBOutlet - 一旦连接了所有按预期触发的内容。这总是小事......

另外,和其他人一样,如果你只需要一个调用,则不需要将它包装在begin / endUpdates中。