我有一个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
我想知道是否有其他人遇到过这样的错误,如果有的话,原因是什么?
答案 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中。