4

UITableViewストーリーボードエディターを使用してセットアップしています。セルを作成するために、標準のデリゲート メソッドを使用しています。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultCell"];
        if (cell == nil)
        {
        // Do cell setup
        }
    // etc
    return cell;
}

セルが最初にキューから取り出される場合を除いて、それは nil ではありません。そのため、if ステートメント内のコードは実行されません。

再利用識別子に一貫性がない場合にこのエラーが発生するため、コードで行っているのとまったく同じ再利用識別子をストーリーボード ビューで使用していることを確認しました。まだ問題に直面しています。また、プロジェクト内にいくつかのテーブルビューがあり、それぞれに一意の再利用識別子があります。まだサイコロはありません。ここで間違っている可能性があることを他に知っている人はいますか?

4

1 に答える 1

12

これは、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が以下に示すように、古いアプローチを引き続き使用できます。指定した識別子のセルプロトタイプをストーリーボードに含めないように注意してください。ビューコントローラはセルプロトタイプからセルを構築できず、dequeueReusableCellWithIdentifiernilを返し、以前とまったく同じ状態になります。

于 2012-04-21T00:09:22.203 に答える