web-dev-qa-db-ja.com

TableView reloadDataとbeginUpdatesおよびendUpdates

TableViewの更新に関して厄介な問題が発生しました。さまざまな更新方法を使用してさまざまな結果が得られます。

状況1:使用する[tbl reloadData];ここで、tblはTableViewを更新するために、TableViewを更新します-意図したとおりに動作します。

状況2:私は使用します:

[tbl beginUpdates];
[tbl reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight];
[tbl endUpdates];

tblはTableViewであり、indexPathsはTableViewに存在するすべてのindexPathを含む配列です。これで、配列は問題なく、すべての正しいindexPath(doubleおよびtripleチェック済み)が含まれていますが、何らかの理由で-これは意図したとおりに機能しません。

今、私はこれがXYの問題(Yを求めるが、Yを解くとXが解決すると思うので私の問題は本当にXである)であり、それはXを説明するのが少し複雑だと感じるからです簡単な方法なので、可能であればそれを控えたいと思います。

だから、私の質問まで: TableViewを更新する2つの方法に違いはありますか(もちろん、アニメーションのビットは別として)、または問題が他の場所にあると疑うべきですか?

編集:さて、私は症状が何であるかを説明しようとします:

cellForRowAtIndexPath- methodで、次のように、セルのindexPath行に等しいタグが割り当てられたボタンを各セルに追加します。

btn.tag = indexPath.row;

これを行う理由は、すべてのボタンが同じ関数を呼び出すため、各ボタンを識別できるようにするためです。

- (void)btnPressed:(id)sender

その後、セルを更新すると-セルの一部の値が変更されたため-状況1ではすべてが正常に機能しますが、状況2では-タグが混同されるため、次にボタンの1つが押されると正しいタグがなくなります。

混乱は私にはランダムに見えますが、ランダム化は最初に押したセルボタンによって異なります。これが私の問題を明らかにすることを願っています。

30
Tobias Tovedal

UITableViewドキュメントから

beginUpdates
レシーバーの行とセクションを挿入、削除、または選択する一連のメソッド呼び出しを開始します。

つまり、挿入、削除、または選択しない限り、これを使用しないでください。あなたはこれらのどちらもしていません。

また、beginUpdatesendUpdatesではなく、reloadDataで終了する必要があります。ドキュメンテーション:

このグループのメソッドは、endUpdatesの呼び出しで終了する必要があります。

22
Mundi

後続の挿入、削除、および選択操作(たとえば、cellForRowAtIndexPath:およびindexPathsForVisibleRows)を同時にアニメーション化する場合は、このメソッドを呼び出します。

これがあなたの望むものだと思います。 beginUpdatesおよびendUpdatesは、アニメーション付きのUItableviewを変更できます。

1
gfxcc