20

UITableView でカスタム UITableViewCell を使用していますが、dequeueReusableCellWithIdentifier を呼び出すときにセルが決して nil にならないという問題があります。どうしてこれなの ?

- (void)viewDidLoad
{
    [super viewDidLoad];
    UINib *nib = [UINib nibWithNibName:@"PHResultTableViewCell" bundle: nil];
    [[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    PHResultTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
    if (cell == nil)
    {
        PackageHolidayItem *obj=[[PackageHolidayItem alloc]init];
        obj= [totalArray objectAtIndex:indexPath.row];
        cell.packageHolidayItem = obj;
        [cell loadRow];

    }
    return cell;
}    
4

4 に答える 4

22

iOS 5 以降、ストーリーボードを使用し、再利用識別子がストーリーボードのプロトタイプと一致する場合、dequeueReusableCellWithIdentifier から nil が返されなくなりました。

Apple Doc から:

iOS 用テーブル ビュー プログラミング ガイド

テーブル ビューの作成と構成

動的テーブル ビューにデータを入力する

dequeueReusableCellWithIdentifier: メソッドがストーリーボードで定義されているセルを要求する場合、メソッドは常に有効なセルを返します。再利用されるのを待っているリサイクルされたセルがない場合、メソッドはストーリーボード自体の情報を使用して新しいセルを作成します。これにより、nil の戻り値を確認して手動でセルを作成する必要がなくなります。

セルアドレスをログに記録して、再利用されていることを証明できます。ただし、ログを同梱しないでください。テーブルが本当に遅くなります。

NSLog(@"Deque Cell %p", cell);

ブレークポイントを使用してログに記録することをお勧めします。

ここに画像の説明を入力

$25 = 0x097f9850 <DDSImageSubtitleCheckedTableViewCell: 0x97f9850; baseClass = UITableViewCell; frame = (0 22; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0x97f9740>>
$26 = 0x0a6a4a00 <DDSImageSubtitleCheckedTableViewCell: 0xa6a4a00; baseClass = UITableViewCell; frame = (0 66; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa6a4b50>>
$27 = 0x0a3ad250 <DDSImageSubtitleCheckedTableViewCell: 0xa3ad250; baseClass = UITableViewCell; frame = (0 110; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa3ad390>>
$28 = 0x0a3ae640 <DDSImageSubtitleCheckedTableViewCell: 0xa3ae640; baseClass = UITableViewCell; frame = (0 176; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa3ae780>>
$29 = 0x0972a370 <DDSImageSubtitleCheckedTableViewCell: 0x972a370; baseClass = UITableViewCell; frame = (0 220; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0x972a340>>

住所だけ知りたいなら

ここに画像の説明を入力

0x097f9850
0x0a6a4a00
0x0a3ad250
0x0a3ae640
0x0972a370
于 2013-05-05T19:23:52.747 に答える
3

他の人が指摘したように、ペン先を登録して tableViewCell を再利用した場合、セルのインスタンスを取得することが保証されます。セルに値を設定したい場合。このようにコードを変更してみることができます

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

        PHResultTableViewCell *cell = (PHResultTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MyCell" 
                                                                                               forIndexPath:indexPath];];

        cell.packageHolidayItem = totalArray[indexPath.row];;
        [cell loadRow];

        return cell;
    }    
于 2013-05-05T07:16:39.250 に答える
0

nil を返すことになっているとは思いません。なぜあなたはそれをしたいのですか?

このメソッドdequeueReusableCellWithIdentifierは、表示されようとしている Cell を返すので、実際には null でない方が良いです。必要に応じて変更できます。

于 2013-05-05T06:45:34.633 に答える