我有一个tableview,其中填充了一组对象的数据。物品有价格,名称等等。
删除单元格后,数据源(数组)会更新,并使用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
答案 0 :(得分: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的项目。它有很多好处,大部分时间都是值得的。