我在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;
}
答案 0 :(得分:22)
从iOS 5开始,当您使用故事板并且您的重用标识符与故事板中的原型匹配时,您将无法从dequeueReusableCellWithIdentifier返回nil。
来自Apple Doc:
适用于iOS的Table View编程指南
创建和配置表视图
使用数据填充动态表视图
如果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
答案 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 - 这样你可以根据需要修改它。