5

私は次のように UITableView のいくつかの行を削除しています:

[tableView deleteRowsAtIndexPaths:toDelete withRowAnimation:UITableViewRowAnimationAutomatic];

これにより、削除操作に素敵なアニメーションが追加されます。

ただし、削除した後、現在表示されているすべての行を更新する必要があります。通話中

[tableView reloadData];

最初の呼び出しが機能した直後ですが、素敵なアニメーション効果はなくなりました。これを行うためのより良い方法は何ですか? つまり、削除操作をアニメーション化し、現在表示されているすべての行を更新するには? ありがとう!

これを行う必要があるのは、各セルに「チェックボックス」が含まれているためです。私のView Controllerはチェックボックスのデリゲートであり、各チェックボックスにはNSIndexPathが関連付けられています。チェックボックスが切り替えられると、delegate が呼び出され、x インデックス パスを切り替えたことを伝えます。ここで、いくつかの行が削除された場合、インデックス パスを更新する必要があります。そのため、各チェックボックスが所属する場所を認識できるように、すべてをリロードする必要があります。

4

4 に答える 4

1

ctrahey のアニメーション ブロックは、時間が経過しても機能しません。UITableView の削除、挿入、リロードのメカニズムを調査しました。この問題に対処するために、Github でプロジェクトを維持しています。

https://github.com/VansonLeung/VanTableController

これには、作業単体テストが含まれています。通常、UITableView のセル アニメーションをアニメーション化するには、次のようにする必要があります。

[tableView_ beginUpdates];
[tableView_ deleteRowsAtIndexPaths: indexPathDelete withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView_ insertRowsAtIndexPaths: indexPathInsert withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView_ reloadRowsAtIndexPaths: indexPathReload withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView_ endUpdates];

行の削除、行の挿入、および行の indexPath 配列のリロードを決定する必要があり、非常に厄介な作業です。私のプロジェクトの作業は基本的に、これらの indexPaths を生成するためのラッパーです。

于 2013-02-17T02:34:11.610 に答える
0

それに関連していくつかの問題がありました。固定インデックスを使用すると、おそらく多くの頭痛に直面するでしょう。NSIndexPathではなく、データソースからのアイテムへの参照をUITableViewCellに追加して、これを解決しました。したがって、セルに保存された indexPath を使用する必要はありません。

reloadDataまた、Apple の Web サイトには、メソッドを挿入または削除メソッド内で使用してはならないという情報がいくつかあります。

アップルのドキュメント

このすべてのメソッドを使用して、セル、セクション ヘッダーとフッター、インデックス配列など、テーブルの作成に使用されるすべてのデータを再読み込みします。効率を高めるため、テーブル ビューには表示されている行のみが再表示されます。リロードの結果としてテーブルが縮小した場合、オフセットを調整します。テーブル ビューのデリゲートまたはデータ ソースは、テーブル ビューのデータを完全に再読み込みする場合に、このメソッドを呼び出します。特に beginUpdates と endUpdates の呼び出しで実装されたアニメーション ブロック内では、行を挿入または削除するメソッドで呼び出すべきではありません。

于 2014-09-16T11:21:37.880 に答える
0

注: コメントに記載されているように、この回答は機能しない可能性があります。承認されない場合は、削除します。

これがこれを行うための最良の方法であると 100% 確信しているわけではありませんが、この方法には心地よくクリーンな何かがあります。reloadData基礎となるモデルを変更した後、通常の UIView アニメーション ブロックでラップできます。

// if self.people is a mutable array
[self.people removeObjectAtIndex:13];

[UIView animateWithDuration:0.5 animations:^{
  [self.tableView reloadData];
}];
于 2012-09-02T18:24:23.993 に答える