9

再利用識別子を使用してプログラムでセルを作成しています。

-セルの作成にストーリーボードを使用していません

セルがデキューされるたびに、セルはnilになるため、allocを使用してセルを新しく作成する必要がありますが、これにはコストがかかります。

編集(さらに1つの質問を追加し、コードを修正しました)

質問

  • このデキューが常にnilを返すのはなぜですか?どうすれば修正できますか?
  • デキューは、ストーリーボード/ nibファイルと一緒に使用した場合にのみ機能しますか?

コード

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(!cell) //Every time cell is nil, dequeue not working 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    }

    return cell;
}
4

4 に答える 4

12

CellIdentifier最初にをとして設定する必要がありますCell。あなたはそれをしていますか?新しいセルを作成するときは、この識別子Cellをセルに割り当てる必要があります。dequeueReusableCellWithIdentifierそうして初めて、iOSはその識別子を使用できるようになります。プログラム的にあなたはそうすることができます-

UITableViewCell *cell = [[UItableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"];

InterfaceBuilderからも識別子を設定できます-

ここに画像の説明を入力してください

于 2012-11-14T13:24:48.420 に答える
11

私はいくつかの間違いを犯していました:

  1. のサブクラスを使用してUITableViewControllerいましたが、サブクラスの外部にtableViewを作成していました
  2. tableViewテーブルビューコントローラに作成されたものがあります。これは、self.tableViewインデックスパスのセルを返すときにテーブルビューコントローラにあり、self.tableViewの代わりに使用していましたtableView
  3. また、セル識別子が次のように宣言されていることを確認してくださいstatic

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

tableViewとは異なるテーブルを表していたためself.tableView、セルは同じテーブルからデキューされておらず、したがって常にnil

于 2012-11-14T21:25:17.977 に答える
2

このコードは、実際には何も返さないため、「コントロールが非void関数の終わりに到達しました」という警告を生成するはずです。return cell;関数の最後に追加します。さらに、新しく作成されたセルに再利用識別子を追加することはありません。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";    
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    return cell;
}
于 2012-11-14T13:45:18.740 に答える
1

まず、 viewDidLoadメソッドでtableViewCellのセル識別子を次のように宣言します。

[tableView registerClass:UITableViewCell.class forCellReuseIdentifier:@"MyCell"];

ここで、次と同じ識別子「MyCell」を持つUITableViewCellのインスタンスを思い出してください。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];

さらに、セルを埋めるだけです。これで、ロジックが実行され、限られた数のセルが非常に大きなリストを効率的に表示できるようになります(デキューの概念を使用)。

ただし、セルで使用されるすべてのUIViewに値(必要な場合はnilでも)を割り当てることを忘れないでください。そうしないと、テキスト/画像の上書き/オーバーラップが発生します。

于 2015-04-29T13:03:40.863 に答える