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中是没有必要的。