dequeueReusableCellWithIdentifier永远不会返回nil

我在我的UITableView中使用自定义的UITableViewCell,但问题是,调用dequeueReusableCellWithIdentifier时,单元格永远不会为零。 为什么是这样 ?

- (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; } 

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

从Apple Doc:

适用于iOS的表格视图编程指南

创build和configuration表视图

用数据填充dynamic表格视图

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

你可以logging单元格地址,以certificate你自己正在被重用。 但是不要随着日志logging,它会真的放慢你的桌子。

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

更好的是使用断点来logging它。

在这里输入图像说明

 $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 

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

如果dequeueReusableCellWithIdentifier:无法在tableviews的重用队列中find一个单元格,它会从您指定的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; } 

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

dequeueReusableCellWithIdentifier方法返回一个即将被显示的Cell,所以它不是空的 – 这样你可以根据需要修改它。