1

さまざまなカスタム UITableViewCells (およびセル識別子) を持つ UITableView を持つアプリケーションがあります。

実装されたtableView:cellForRowAtIndexPath:メソッドでは、UITableView のdequeueReusableCellWithIdentifier:メソッドを使用し、ユーザーがテーブルをスクロールしているときに呼び出されると、期待されるタイプの UITableViewCell を提供しますが、コードの他の部分で再利用可能なセルを取得しようとすると、nil が得られます。そのため、新しいセルをインスタンス化する必要があります。

たとえば、表示する新しいオブジェクトを挿入するコードは次のようになります。

...
[myDataSource addObject:newObject];
...
[self.tv beginUpdates];
[self.tv insertRowsAtIndexPaths:paths withRowAnimation:rowAnimation];
[self.tv endUpdates];
...

画面を離れたばかりのセルは、挿入しているのと同じタイプ (同じセル識別子) でしたが、tableView:cellForRowAtIndexPath:それはその呼び出しで and をトリガーし、 nil を返します。dequeueReusableCellWithIdentifier:

再利用可能なセルを提供するべきではありませんか?私の場合、私のセルはその複雑さのためにやや「重い」init メソッドを持っているため、これは問題になる可能性があります。

前もって感謝します

Edit1:明確にするために、(挿入しているのと同じタイプの) 一部のセルが表示されなくなったため、テーブルキャッシュに未使用のセルインスタンスが返されない理由を知りたいですか?

4

1 に答える 1

4

使用中の各セルには、独自の一意のインスタンスが必要です。テーブルをスクロールしていると、iOS は使用されなくなったセルをキャッシュし、これらの使用されていないインスタンスが によって返されtableView:dequeueReusableCellWithIdentifier:ます。あなたの場合、返されるキャッシュに未使用のインスタンスはありません。

init メソッドに関する限り、そこで時間のかかることは何もすべきではありません。たとえば、リモート コンテンツをダウンロードしてセルに表示する場合は、バックグラウンドでダウンロードし、完了したらテーブル/セルを更新する必要があります。

于 2011-12-20T15:43:23.887 に答える