4

[更新]

我发现了问题。我创建了一个自定义 UITableViewCell,并且没有使用标准方法来触发删除。我的自定义 UITableViewCell 有一个自定义 indexPath 属性,我在创建单元格时填充了该属性。这就是为什么如果不调用重新加载数据就不会更新它的原因。

作为一种解决方法,为了尽量减少代码重写,我使用标记为答案的解决方案。

[/更新]

我见过其他类似的问题,但不完全相同......

我有一个 UITableView 从 NSArray 中的对象获取它的行(单元格)。这些行使用 indexPath.row 映射到 NSArray。这意味着 NSArray 中索引为 0 的对象对应于 indexPath.row 为 0 的单元格。

每当我删除一行时,我都会从 NSArray 中删除该对象(如许多示例中所见,包括 Apple 的文档)。

问题是,每当删除一行时,indexPath 都不会更新。例如:

我有一个 3 行的表格视图。这意味着我有 indexPath.row 0、1 和 2。此外,相应的 NSArray 对象的索引为 0、1 和 2。

当我从 UITableView 中删除第 1 行并删除 NSArray 中的相应对象时,剩下的是 indexPath.row 1 和 2,但 NSArray 的索引是 0 和 1。

如果我尝试从 UITableView 中删除现在的第二行,我会遇到问题,因为它的 indexPath.row 为 2,但 NSArray 中的相应对象的索引为 1。

换句话说,indexPath.row 和对象索引不再“同步”。

人们建议使用 UITableView 的 reloadData 方法......事实上,这确实“重置”了 indexPaths,但会中断 UITableView 行动画。

如何删除行、更新 indexPaths 并仍然保持 UITableView 的动画?!

4

4 回答 4

4

未经测试,但我能想到的几件事是延迟重新加载直到动画完成。或者只是使用以下方法重新加载这些行而不是整个表:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

延迟:

[tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.5];
于 2013-04-26T19:13:16.083 回答
2

看看 NSFetchedResultsControllerDelegate 通常如何处理它:http: //developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsControllerDelegate_Protocol/Reference/Reference.html

基本上,从表格视图中删除单元格所需要做的就是调用[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]

如果您有一些更改来包装它们[tableView beginUpdates][tableView endUpdates]立即触发所有动画。

如果这仍然会导致不同步的问题,只需使用先删除最后一个 indexPath 的旧技巧,然后继续前进。这样所有中间 indexPaths 都保持有效。

于 2013-04-26T22:26:40.757 回答
0
于 2014-09-16T11:23:50.960 回答
0

我有一个类似的问题,我将手势识别器分配给一个单元格并使用indexPath手势识别器中的 与数据源进行交互。

在构建手势识别器时,我没有使用提供的方法,而是在 tableView 上获取了提供indexPath的方法。即使添加或删除了单元格,这种方法也提供了更新的单元格。tableview:cellForRowAtIndexPath:indexPathcellForRowAtIndexPath:indexPath for

于 2015-03-06T15:46:26.967 回答