50

公式ドキュメントから:

再利用識別子は、テーブル ビューのデリゲートが (パフォーマンス上の理由から) テーブル ビューの複数行の基礎として再利用する目的で作成する UITableViewCell オブジェクトに関連付けられています。initWithFrame:reuseIdentifier: でセル オブジェクトに割り当てられ、その後変更することはできません。UITableView オブジェクトは、現在再利用可能なセルのキュー (またはリスト) を維持し、それぞれに独自の再利用識別子があり、dequeueReusableCellWithIdentifier: メソッドでデリゲートがそれらを利用できるようにします。

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

私はこれを理解していません。UITableViewCells を作成し、新しいもの (またはそのようなもの) を作成する代わりに、できるだけ多くを再利用しようとする基本的な考え方は理解できます。しかし、セルが再利用可能かどうかを正確に決定するものは何ですか? 2 つの同一の (視覚的に) セルがあるが、テキストが異なる場合 (完全に同一ではないと思います)、それらは両方とも同じ識別子を持つことができますか? それとも、別のものを用意する必要がありますか? または、どのような状況で異なる識別子を使用することになっていますか?

誰かがそれがある場所を明確にしたり、リンクしたりできますか?

4

3 に答える 3

67

わかりました、これは私がそれが機能すると信じている方法です:

tableViewにdequeueReusableCellWithIdentifierを使用すると、処理を大幅に高速化できます。多数のセルをインスタンス化する代わりに、必要な数、つまり表示されているセルをインスタンス化するだけです(これは自動的に処理されます)。リスト内でまだ視覚的表現が得られていない「セル」がある領域にスクロールすると、新しいセルをインスタンス化する代わりに、既存のセルを再利用します。

これを行うことで、これを自分で試すことができます。

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    NSLog(@"new one");
}
else
{
    NSLog(@"old one");
}

該当する場合にのみ、dequeueReusableCellWithIdentifierがセルを返すようにしたいことを忘れないでください。したがって、セルを再利用する場合は、状況に応じてセルが正しいことを確認してください。それがreuseIdentifiersの目的です。通常、必要なのは1つだけです。ただし、いくつかの異なる種類のセルを使用するリストがある場合があります。その場合は、異なるreuseIdentifiersを提供して、それらを分離しておく必要があります。そうしないと、他の種類のセルとして扱うセル(たとえば、必要なカスタムセルの代わりにUITableViewセル)を取得してしまう可能性があります。

したがって、基本的に、私が理解しているように、セルの種類ごとに異なるreuseIdentifiersを使用します。ここで、kindはクラスを意味します。標準セルのみを使用する場合は、おそらく1つのreuseIdentifierのみが必要です。

このデザインパターンは、オブジェクトプーリングと呼ばれます。

于 2010-02-15T23:36:26.020 に答える
10

quanoのそうでなければ非常に良い答えにいくつか追加するだけです:(これをコメントとして追加しようとしましたが、長すぎました!)

非常に特殊な状況ではこれを行う必要がありますが、再利用識別子でさえ開発中に省略できます。6 ~ 7 個のセルのテーブル ビューがあり、それぞれが異なる場合、識別子として nil を使用して新しいセルを作成することが望ましい場合があります。

再利用可能なセルを持つということは、cellForRowAtIndexPath が呼び出されるたびに、セルをチェックし、再利用可能なセルがない場合は初期化する必要があることを意味します。init スコープの外では、可能なすべてのインデックスパスを明示的に反復し、各ラベルの値を設定する必要があります。あなたが持っている細胞の種類に応じて明示的に!したがって、10 個の異なるセルを含むテーブル ビューでは、nil の場合はセルを作成し、作成した内容に応じてセルを埋める必要があります。

したがって、この場合、コード メンテナンスの観点から、各セルを nil 識別子で初期化し (再利用しないため)、再利用を気にせずに各セルの情報を適切に入力することをお勧めします。

于 2012-08-17T11:07:54.863 に答える
2

UITableView は、各 のセル プールを持つようなもので、セルをreuseIdentifierリサイクルします。

http://oleb.net/blog/2014/05/scrollviews-inside-scrollviews/のこのビデオが好きです

http://im.ezgif.com/tmp/ezgif-3302899694.gif

于 2016-04-16T21:14:01.473 に答える