2017-09-01 93 views
0

这是我的场景: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]

回答

0

从文档:

当调用此方法在由beginUpdates和endUpdates方法定义的动画块,它的行为类似于deleteRowsAtIndexPaths:withRowAnimation :.在任何更新之前,UITableView传递给方法的索引都在表视图的状态中指定。无论在动画块中插入,删除和重新加载方法调用的顺序如何,都会发生这种情况。

在我看来你并不需要或需要这种呼叫或方法。您正在更新单个索引。 如果你想要更新多个索引,你应该通过创建一个你想要更新的索引数组来安排它,然后在完成数据更新时使用beginUpdates/endUpdates系列。

+0

当我刚刚使用了beingUpdates/endUpdates时,我得到了崩溃...所以我尝试了使用reloadRowsAtIndexPaths方法,但它没有解决它。所以我试着把它们合并。没有工作。 –

0

-endUpdates方法强制UITableView重新计算所有可见单元格的高度。它在此之前,它验证当前显示的数据的一致性,并调用它dataSource

- numberOfSectionsInTableView: 
- tableView:numberOfRowsInSection: 

方法。 当您不呼叫-reloadData时,UITableView依赖之前收集的数据(例如,节数,节中的行数)是相同的。

当它不一样时,你会得到断言和崩溃。

为了与UITableView的状态数据的一致性,必须删除/插入单元格在哪里对象都消失了或新出现的beginUpdates/endUpdates块内索引路径。

+0

我明白崩溃意味着什么以及它发生的原因,但我想知道如何判断是重新加载表还是重新加载单元格。即使没有使用reloadRowsAtIndexPaths,也会发生崩溃,因为模型与表格不同步。如何判断模型是否与当前数据不同步? –

+0

保持tableView与模型同步的一种可能方法是使用NSFetchedResultsController。它将报告当前显示在表格中的所有数据集的变化,并且您将能够使用动画插入/删除行。 – DisableR

+0

没问题,但是我的模型没有核心数据实体的支持(现在我无法将其移动到核心数据,因为很多原因,现在不值得深入研究)。 –