web-dev-qa-db-ja.com

iPhone-usesIdentifier(UITableViewCell)とは何ですか?

公式文書から:

再利用識別子は、Table Viewの複数行の基礎として(パフォーマンス上の理由で)再利用する目的でTable Viewのデリゲートが作成する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つの同一の(視覚的に)セルを持っているが、テキストが異なる場合(完全に同一ではないと思う)、それらは両方とも同じ識別子を持つことができますか?それとも、それらは異なるものを持っているべきですか?または、どのような状況で異なる識別子を使用することになっていますか?

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

50
quano

わかりました、これは私がそれが働くことを信じる方法です:

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つだけです。しかし、いくつかの異なる種類のセルを使用するリストが存在する場合があり、その場合は、異なるuseuseIdentifiersを提供することでそれらを別々に保つ必要があります。そうしないと、他の種類のセルとして扱うセルを取得してしまう可能性があります(たとえば、カスタムのセルではなくUITableViewセル)。

したがって、基本的には、私が理解しているように、種類がセルを表すさまざまな種類の再利用識別子を使用します。種類はクラスを意味します。標準セルのみを使用する場合は、おそらく、reuseIdentifierが1つだけ必要です。

この設計パターンは、 オブジェクトプーリング として知られています。

66
quano

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

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

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

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

10
csotiriou

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

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

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

2
onmyway133