UITableView的reloadRowsAtIndexPaths:(NSArray *)indexPaths无法重新加载,除非你调用它两次?
我有一个UITableViewControllerpipe理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];
问题是该行不重新加载。 从来没有callbackcellForRowAtIndexPath。
疯狂的事情是,如果我调用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
我想知道是否有其他人遇到过这样的错误,如果是这样的话,原因是什么?
reloadRowsAtIndexPaths:...
只在包装在调用之间时才起作用:
- (void)beginUpdates; - (void)endUpdates;
除此之外,行为是不确定的。 (正如你所发现的,相当不可靠)。
编辑:引用“iPhone OS的表视图编程指南”的相关部分:
要为批次插入和删除行和部分创buildanimation,请在连续调用beginUpdates和endUpdates所定义的animation块中调用插入和删除方法。 如果不在该块内调用插入和删除方法,则行和部分索引可能无效。 beginUpdates … endUpdates块不可嵌套。
在块的结束处,也就是endUpdates返回之后,表视图查询其数据源,并像往常一样对行和段数据进行委托。 因此,应该更新支持表视图的集合对象以反映新的或移除的行或节。
在iPhone OS 3.0中引入的reloadSections:withRowAnimation:和reloadRowsAtIndexPaths:withRowAnimation:方法与上面讨论的方法有关。 它们允许您请求表视图重新加载特定部分和行的数据,而不是通过调用reloadData加载整个可见表视图。
我知道这个话题有点古怪,但是我遇到了同样的问题和一个简单的问题。 我有一个表视图,当我调用reloadData和/或reloadRowsAtIndexPaths,tableview方法cellForRowAtIndexPath不会触发。
事实certificate,我没有把Interface View Builder中的tableview IBOutlet连接起来 – 一旦这个连接被按照预期发生了。 总是这些小东西…
另外,和其他人一样,如果你只需要一个调用,那么将其包装在begin / endUpdates中是没有必要的。