这是我的场景:UITableView - reloadData或reloadRowsAtIndexPaths:
我有一个标签的单元格。当我第一次加载单元格时,模型可能没有标签所需的数据...因此,当我(通过委托调用)发现模型刚刚获得了标签数据或标签数据已更改时,我可以重新加载特定的单元格。我需要重新加载单元格(而不是仅设置标签的文本)的原因是,它的高度可能会根据标签是否包含文本而发生变化。
下面是我在做我的委托电话是什么:
- (void)modelLabelDataDidChangeForModel:(NSString *)modelId
{
NSIndexPath *indexPath = [self indexPathForModel:modelId]; // Local method to get index path.
MyCell *cell = (MyCell *) [self.table cellForRowAtIndexPath:indexPath];
if (cell) {
[self.table beginUpdates];
[cell updateMostImportantContent];
[self.table reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.table endUpdates];
}
}
我得到在endUpdates
崩溃(*** Assertion failure in -[UITableView _endCellAnimationsWithContext:]
),因为它说的行数后,更新不匹配的数量更新之前的行(因为我没有在更新块中显式地添加/删除任何行;我只是重新加载了1行)。
因此,这使得我认为该模型可能同时进行了2次更改:标签数据正在改变1个项目(因此我的委托调用),但随后也将一个项目添加到模型中因此崩溃)。
所以这让我觉得,我怎么能告诉我是否需要拨打reloadData
或我是否可以重新加载1单元格reloadRowsAtIndexPaths:@[indexPath]
?
我是否必须跟踪模型本身,还是有什么我可以做的表视图来确定这一点,并避免崩溃?
我的目标是高效:当我需要时致电reloadData
,但我可以时致电reloadRowsAtIndexPath:@[indexPath]
。
当我刚刚使用了beingUpdates/endUpdates时,我得到了崩溃...所以我尝试了使用reloadRowsAtIndexPaths方法,但它没有解决它。所以我试着把它们合并。没有工作。 –