これは、UITableViewが機能する方法ではなくなりました。あなたの質問を読んで、あなたはそれが以前にどのように機能したかについても混乱しているかもしれないと思います。そうでない場合は、申し訳ありませんが、これの最初の部分は単なるレビューです。:)
ストーリーボードセルのプロトタイプなし
以前は次のように機能していました。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// If the tableview has an offscreen, unused cell of the right identifier
// it will return it.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultCell"];
if (cell == nil)
{
// Initial creation, nothing row specific.
}
// Per row setup here.
return cell;
}
ここで、再利用識別子を使用してセルを作成する場合、ここでは初期設定のみを行います。この特定の行/indexPathに固有のものはありません。
行ごとの設定コメントを入力したところ、正しい識別子のセルがあります。新鮮なセルでも、リサイクルされたセルでもかまいません。この特定の行/indexPathに関連するすべての設定はあなたが担当します。
例:一部の行にテキストを設定する場合(おそらく)、すべての行にテキストを設定またはクリアする必要があります。そうしないと、設定した行のテキストが、設定していないセルにリークします。
ストーリーボードのプロトタイプ付き
ただし、ストーリーボードでは、ストーリーボードとテーブルビューが最初のセル作成を処理します。これは素晴らしいものです。ストーリーボードを使用する場合は、セルのプロトタイプをテーブルビューに直接マップすると、CocoaTouchが最初の作成を行います。
代わりに、次のようになります。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultCell"];
// You'll always have a cell now!
// Per row setup here.
return cell;
}
以前と同じように行ごとの設定を行う必要がありますが、インラインまたは独自のサブクラスで最初の空のセルを作成するためのコードを記述する必要はありません。
Ianが以下に示すように、古いアプローチを引き続き使用できます。指定した識別子のセルプロトタイプをストーリーボードに含めないように注意してください。ビューコントローラはセルプロトタイプからセルを構築できず、dequeueReusableCellWithIdentifier
nilを返し、以前とまったく同じ状態になります。