4

我有一个表格视图,其中填充了来自对象数组的数据。对象有价格、名称等。

当一个单元格被删除时,数据源(数组)被更新,并且该行使用 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

4

1 回答 1

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 的项目。它有很多好处,以至于大部分时间都值得付出努力。

于 2012-10-27T13:56:05.950 回答