我有一个我在IB中创建的自定义UITableViewCell。要使用从NIB加载的这些单元格的实例填充UITableView,我使用以下代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"overviewCell";
HOStoreOverviewCell *cell = (HOStorwOverviewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
UIViewController *c = [[UIViewController alloc] initWithNibName:@"HOStoreOverviewCell" bundle:[NSBundle mainBundle]];
cell = (HOStoreOverviewCell *)c.view;
}
HOStore *itemAtIndex = (HOStore *)[self.infoController storeInListAtIndex:indexPath.row];
cell.storeName.text = itemAtIndex.name;
cell.distance.text = [itemAtIndex niceDistance];
cell.hours.text = [itemAtIndex.currentHour niceHours];
NSLog(@"%@", cell);
return cell;
}
HOStoreOverviewCell是我在NIB中的自定义UITableViewCell,它包含三个UILabel(storeName,distance和hours)。因此,此代码尝试使可重用单元出列,如果不能,则通过从NIB加载它来创建新单元。然后,它将UILabels的文本设置为数组中项目(HOStore)的相关信息位。非常标准的东西。
我的问题是:大多数单元格显示正常,但偶尔(我无法可靠地重现这一点)UITableView将“错过”一个单元格 - 例如,它将显示第10个单元格和第12个细胞但不是第11个细胞。在第11个单元格中应该有一个空白点,并且点击此点不会产生任何影响。点击空白点下方的任何位置将为我提供didSelectRowAtIndexPath:indexPath委托方法,indexPath.row始终设置为缺少的索引(例如11)。
查看NSLog输出(摘录)时出现问题的根:
2009-08-26 00:22:29.292 AppName[380:207] <HOStoreOverviewCell: 0x42c9880; baseClass = UITableViewCell; frame = (0 660; 320 66); autoresize = W; layer = <CALayer: 0x42c9a60>>
2009-08-26 00:22:30.331 AppName[380:207] <HOStoreOverviewCell: 0x42c9880; baseClass = UITableViewCell; frame = (0 nan; 320 66); autoresize = W; layer = <CALayer: 0x42c9a60>>
2009-08-26 00:22:32.138 AppName[380:207] <HOStoreOverviewCell: 0x42c71d0; baseClass = UITableViewCell; frame = (0 594; 320 66); autoresize = W; layer = <CALayer: 0x42c73b0>>
注意第二行中的nan in frame。这对应于当“空白”单元格滚动到视图中时得到的cellForRowAtIndexPath:indexPath回调。
关于可能导致此问题的任何想法?
答案 0 :(得分:1)
这部分代码很好奇:
if (cell == nil) {
UIViewController *c = [[UIViewController alloc] initWithNibName:@"HOStoreOverviewCell" bundle:[NSBundle mainBundle]];
cell = (HOStoreOverviewCell *)c.view;
}
为什么要在此处分配通用UIViewController
?这看起来像是一个内存泄漏给我,因为没有人会打电话给它释放。
你应该做更像这样的事情
if (cell == nil)
{
cell = [[[HOStoreOverviewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease];
}
如果从笔尖加载表格单元格,则性能会受到影响。你在代码中分配它们要好得多。我已经在Apple Dev论坛上读了几遍这个,并且我自己也经历过这种情况(使用Nib会让你的桌子变得“滞后”)。