20

我在我的 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;
}    
4

4 回答 4

22

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

来自苹果文档:

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 回答
14

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

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

于 2013-05-05T07:12:45.497 回答
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;
    }    
于 2013-05-05T07:16:39.250 回答
0

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

该方法dequeueReusableCellWithIdentifier返回一个即将显示的单元格,因此它不为空实际上很好 - 这样您可以根据需要对其进行修改。

于 2013-05-05T06:45:34.633 回答