dequeueReusableCellWithIdentifier永远不会返回nil

时间:2013-05-05 06:40:48

标签: ios uitableview

我在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 个答案:

答案 0 :(得分:22)

从iOS 5开始,当您使用故事板并且您的重用标识符与故事板中的原型匹配时,您将无法从dequeueReusableCellWithIdentifier返回nil。

来自Apple Doc:

  

适用于iOS的Table View编程指南

     
    

创建和配置表视图

         
      

使用数据填充动态表视图

             

如果dequeueReusableCellWithIdentifier:方法请求一个单元格       这是在故事板中定义的,该方法始终返回有效的       细胞。如果没有再循环的单元等待重用,则该方法       使用故事板本身的信息创建一个新的。这个       无需检查nil的返回值并创建一个       手动细胞。

    
  

您可以记录单元格地址以向您自己证明它们正在被重用。但是如果没有附带日志记录,它会让你的桌子变慢。

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

最好还使用断点来记录它。

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

如果您只想要地址

enter image description here

0x097f9850
0x0a6a4a00
0x0a3ad250
0x0a3ae640
0x0972a370

答案 1 :(得分:14)

它没有返回nil,因为您已经注册了一个用于单元重用的笔尖([[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCell"];)。

如果dequeueReusableCellWithIdentifier:无法在tableviews重用队列中找到一个单元格,它将从您指定的nib中实例化一个新单元格。

答案 2 :(得分:3)

正如其他人已经指出的那样,如果您已经注册了一个nib来重用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;
    }    

答案 3 :(得分:0)

我不相信它应该返回零。你为什么要这样做?

方法dequeueReusableCellWithIdentifier返回一个即将显示的Cell,所以实际上它不是null - 这样你可以根据需要修改它。