dequeueReusableCellWithIdentifier never returns nil

前端 未结 4 515
臣服心动
臣服心动 2020-12-06 00:30

I am using a custom UITableViewCell in my UITableView but the problem is that the cell is never nil when calling the dequeueReusableCellWithIdentifier. Why is this ?

相关标签:
4条回答
  • 2020-12-06 00:53

    As others have pointed out if you have registerd a nib to reuse a tableViewCell you are guaranteed to get an instance of cell. If you want to set some value to the cell. You can try modifying your code like this

    - (UITableViewCell *)tableView:(UITableView *)tableView 
             cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
            PHResultTableViewCell *cell = (PHResultTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MyCell" 
                                                                                                   forIndexPath:indexPath];];
    
            cell.packageHolidayItem = totalArray[indexPath.row];;
            [cell loadRow];
    
            return cell;
        }    
    
    0 讨论(0)
  • 2020-12-06 00:55

    It does not return nil because you have registered a nib for cell reuse ([[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCell"];).

    if dequeueReusableCellWithIdentifier: can't find a cell in the tableviews reuse queue it will instantiate a new one from the nib you have specified.

    0 讨论(0)
  • 2020-12-06 00:56

    Starting in iOS 5 when you use storyboards and your reuse identifier matches a prototype in your storyboard you will not get a nil returned from dequeueReusableCellWithIdentifier.

    From Apple Doc:

    Table View Programming Guide for iOS

    Creating and Configuring a Table View

    Populating a Dynamic Table View with Data

    If the dequeueReusableCellWithIdentifier: method asks for a cell that’s defined in a storyboard, the method always returns a valid cell. If there is not a recycled cell waiting to be reused, the method creates a new one using the information in the storyboard itself. This eliminates the need to check the return value for nil and create a cell manually.

    You can log the cell address to prove to your self they are being reused. But don't ship with the logging it will really slow up your table.

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

    Better yet use breakpoint to log it.

    enter image description here

    $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>>
    

    If you just want the addresses

    enter image description here

    0x097f9850
    0x0a6a4a00
    0x0a3ad250
    0x0a3ae640
    0x0972a370
    
    0 讨论(0)
  • 2020-12-06 00:56

    I don't believe it is supposed to return nil. Why do you want it to?

    The method dequeueReusableCellWithIdentifier returns a Cell that is about to be displayed, so it's actually good that it is not null - that way you can modify it as needed.

    0 讨论(0)
提交回复
热议问题