4

オブジェクトの配列からのデータが取り込まれたテーブルビューがあります。オブジェクトには価格、名前などがあります。

セルが削除されると、データソース (配列) が更新され、UITableViewRowAnimationFade を使用して行が画面からスライドします。

アイテムが削除されると、配列内のオブジェクトの価格などの特定のプロパティが変更される可能性があるため、データが変更された可能性があるため、画面上のすべてのセルを更新する必要があります。

ドキュメントを調べたところ、 indexPathsforVisibleRows と組み合わせて画面上の行をリロードできる reloadRowsAtIndexPaths:withRowAnimation が見つかりましたが、 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];
}

したがって、ユーザーがセルを削除した場合、データソースは影響を受ける他のオブジェクトを特定し、変更のリストを作成し(正しいindexPathを計算するように注意してください)、を呼び出しdataControllerWillUpdateData、変更されたすべてのオブジェクトに対して上記の適切なメソッドを呼び出し、最後にを呼び出す必要がありますdataControllerDidUpdateData

もちろん、プロジェクトでCoreDataを使用することも検討できます。それにはすべてをセットアップするためにいくらかの作業が必要かもしれませんが、その結果、あなたは上記のすべてとはるかに多くの「無料」を手に入れるでしょう。個人的には、動的なtableViewを含むほとんどすべてのプロジェクトで使用する傾向があります。それは非常に多くの利点を持っているので、ほとんどの場合努力する価値があります。

于 2012-10-27T13:56:05.950 に答える