删除动画完成后更新 TableView [重复]
Posted
技术标签:
【中文标题】删除动画完成后更新 TableView [重复]【英文标题】:Update TableView after deletion animation completes [duplicate] 【发布时间】:2012-10-27 12:53:49 【问题描述】:我有一个表格视图,其中填充了来自对象数组的数据。对象有价格、名称等。
当一个单元格被删除时,数据源(数组)被更新,并且该行使用 UITableViewRowAnimationFade 滑出屏幕。
当一个项目被删除时,数组中对象的某些属性(例如价格)可能会改变,因此我需要更新屏幕上的所有单元格,因为它们的数据可能已经改变。
我查看了文档并发现 reloadRowsAtIndexPaths:withRowAnimation 我可以将它与 indexPathsforVisibleRows 结合使用以重新加载屏幕上的行,但在 tableView:commitEditingStyle:forRowAtIndexPath 中执行此操作看起来真的很讨厌,因为它尝试执行删除动画同时还重新加载...
有没有办法等待删除动画完成后再执行任务?
这是我的 ViewController 中的代码
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
// update the datasource
[self.dataController deleteItemAtIndex:indexPath.row];
// update the table
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
// reload the table to show any changes to datasource from above deletion
[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];
asd
【问题讨论】:
【参考方案1】:编辑:
好的,下次试试。 :) 这肯定行得通,但需要相当多的努力......
您需要准确跟踪数据源中的更改(添加、删除、更新)并在 TableVC 上调用适当的方法。
数据源需要提供以下委托方法:
- (void)dataControllerWillUpdateData;
- (void)dataControllerDidRemoveObjectAtIndexPath:(NSIndexPath *)indexPath;
- (void)dataControllerDidAddObjectAtIndexPath:(NSIndexPath *)indexPath;
- (void)dataControllerDidUpdateObjectAtIndexPath:(NSIndexPath *)indexPath;
- (void)dataControllerDidUpdateData;
然后你像这样改变 tableVC 的实现:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
// update the datasource
[self.dataController deleteItemAtIndex:indexPath.row];
- (void)dataControllerWillUpdateData
[tableView beginUpdates];
- (void)dataControllerDidRemoveObjectAtIndexPath:(NSIndexPath *)indexPath
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
- (void)dataControllerDidAddObjectAtIndexPath:(NSIndexPath *)indexPath
[tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
- (void)dataControllerDidUpdateObjectAtIndexPath:(NSIndexPath *)indexPath
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
- (void)dataControllerDidUpdateData
[tableView endUpdates];
因此,如果用户删除一个单元格,您的数据源必须确定哪些其他对象受到影响,创建更改列表(注意计算正确的 indexPaths),调用dataControllerWillUpdateData
,为每个更改调用上述适当的方法对象,最后调用dataControllerDidUpdateData
。
当然你也可以考虑在你的项目中使用 CoreData。这可能需要一些工作来设置所有内容,但结果是您将获得上述所有内容以及更多“免费”。就我个人而言,我倾向于将它用于几乎所有包含动态 tableViews 的项目。它有很多好处,大部分时间都值得付出努力。
【讨论】:
抱歉,但这并没有真正的帮助,因为在删除动画发生时模型仍会通知控制器,从而导致同样的事情发生。 删除是用户交互还是代码操作的结果? 如果是用户操作的结果(用户点击“编辑”按钮,删除一些单元格并离开编辑模式),您可以覆盖 tableVC 的 setEditing:animated:。在用户编辑时,您跟踪他所做的更改,当用户将编辑模式设置为 NO(即他再次点击编辑按钮)时,您更新数据源 如果我们必须猜测您的代码的外观,这有点难以回答。 ;) 您能否发布数据源和 tableview 委托方法的代码? 删除是通过在单元格上滑动启动的,然后通过代码执行...现在用一些代码更新问题以上是关于删除动画完成后更新 TableView [重复]的主要内容,如果未能解决你的问题,请参考以下文章
iOS:在 TableView 上层 UILabel [重复]