4

[アップデート]

問題が見つかりました。カスタム UITableViewCell を作成しましたが、削除をトリガーする標準的な方法を使用していません。私のカスタム UITableViewCell には、セルの作成時に入力するカスタム indexPath プロパティがあります。そのため、データをリロードする呼び出しがないと更新されません。

回避策として、コードの書き換えを最小限に抑えるために、回答としてマークされたソリューションを使用しています。

[/アップデート]

これに似た他の質問を見たことがありますが、まったく同じではありません...

NSArray 内のオブジェクトから行 (セル) を取得する UITableView があります。行は、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 から 2 番目の行を削除しようとすると、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 を削除するという古いトリックを使用して、上に進んでください。そうすれば、中間のすべての indexPath が有効なままになります。

于 2013-04-26T22:26:40.757 に答える
0

ジェスチャ認識エンジンをセルに割り当てindexPath、ジェスチャ認識エンジンで を使用してデータ ソースと対話するという同様の問題がありました。

ジェスチャ レコグナイザーを構築するときに提供されたメソッドを使用する代わりindexPathに、tableView で提供されたメソッドを取得します。このアプローチにより、セルが追加または削除された場合でも、更新されたセルが提供されました。tableview:cellForRowAtIndexPath:indexPathcellForRowAtIndexPath:indexPath for

于 2015-03-06T15:46:26.967 に答える