37

TableViewの更新に関してトリッキーな問題が発生しました。更新のさまざまな方法を使用すると、さまざまな結果が得られます。説明させてください。

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

状況2: 使用する:

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

tblTableViewはどこにあり、TableViewにindexPaths存在するすべてのindexPathを含む配列です。これで配列は正常になり、すべての正しいindexPath(ダブルおよびトリプルチェック)が含まれていますが、何らかの理由で-これは意図したとおりに機能しません。

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

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

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

-メソッドでは、次のように、セルのcellForRowAtIndexPathindexPath行と等しいタグが割り当てられたボタンを各セルに追加します。

btn.tag = indexPath.row;

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

- (void)btnPressed:(id)sender

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

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

4

3 に答える 3

28

UITableViewドキュメントから

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

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

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

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

于 2011-11-17T20:49:20.070 に答える
7

との最初の違いはreloadData、実行時に同じ indexPath に対してreloadRowsAtIndexPaths2 つのオブジェクトが同時に割り当てられることです(テーブルビューが新しいセルで「ブレンド」されるため)。これは、 のコードでは予測できない場合があります。驚きは、セルが特定のセル ID に既に割り当てられている場合でも、 を呼び出したときにテーブル ビューがこのセルを返さず、代わりに nil を返すという事実から来ています。矛盾して、すでに割り当てられているセルを再利用します。UITableViewCellreloadRowsAtIndexPathscellForRowAtIndexPathdequeueReusableCellWithIdentifierreloadRowsAtIndexPathsreloadData

2 番目の違いは、直接呼び出したendUpdates後(そこにブレークポイントを設定すると、スタック トレースに表示されます) に対し 、後で呼び出しをスケジュールします(スタック トレースには表示されません)。reloadRowsAtIndexPathscellForRowAtIndexPathendUpdatesreloadDatacellForRowAtIndexPath

ただし、そこで何をしているのかを理解するために、もう少しコードを投稿する必要があります。reloadRowsAtIndexPaths原則として、行を削除または挿入しない限り、新しいセルの indexPath は古いセルと同じです。

于 2015-05-03T20:52:58.213 に答える
2

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

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

于 2015-07-16T17:58:37.363 に答える