UITableViewCell帧具有NaN值

时间:2009-08-25 23:47:00

标签: iphone uitableview

我有一个我在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回调。

关于可能导致此问题的任何想法?

1 个答案:

答案 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会让你的桌子变得“滞后”)。