多个UITableViewCell类型实现

时间:2010-11-18 02:36:20

标签: iphone objective-c

我正在创建一个自定义单元格类,其中我在init方法中放置了不同类型的子视图,但框架为CGRectZero。

self.subTitleLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];[self.contentView addSubview:self.subTitleLabel];

self.scannedProductLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview:self.scannedProductLabel];

self.requestStatusLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview:self.requestStatusLabel];

在我的layoutSubviews方法中,我根据需要使用这些标签。例如,对于一种类型的单元格,我将使用第一个标签,而对于其他类型将使用另一个标签。

if ([self.cellType isEqualToString:@"CustomerDetails"] ) {
        //self.productImageView.frame = CGRectMake(aContentRect.origin.x + kCellOffset, 0.0f, aTitleCellWidth , floorf(aHeight/4));
        self.titleLabel.frame = CGRectMake(aContentRect.origin.x + kCellOffset, 0.0f, aTitleCellWidth , floorf(aHeight/2));
        self.subTitleLabel.frame = CGRectMake(aContentRect.origin.x + kCellOffset, floorf(aHeight/2), aTitleCellWidth, floorf(aHeight/4));
        self.requestStatusLabel.frame = CGRectMake(aContentRect.origin.x + kCellOffset, floorf((aHeight/2) + (aHeight/4)), aTitleCellWidth , floorf(aHeight/4));
    }

我的问题是,从内存的角度来看这是一个好主意。好像我的目的已经解决但我的自定义单元格对象包含在内存中但不可见的子视图。如果是,那么这种情况的替代方法是什么。

2 个答案:

答案 0 :(得分:0)

如果并非所有子视图都会用于每种单元格类型,我建议在首次访问时轻松创建每个子视图。这可以通过覆盖它的getter来实现:

- (UILabel)subTitleLabel {
    if (subTitleLabel == nil) {
        subTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(kSubTitleX, kSubTitleY, kSubTitleWidth, kSubTitleHeight)];
        [self.contentView addSubview:subTitleLabel];
    }
    return subTitleLabel;
}

这样,subTitleLabel就会在第一次通过其getter访问时创建并添加到内容视图中。如果您从未调用过getter,例如,因为单元格的类型不需要它,self.subTitleLabel永远不会被调用,subTitleLabel永远不会被创建。

答案 1 :(得分:0)

我不认为这里的记忆问题会是一个大问题。如果您正确地重复使用单元格,那么您可能只在列表中创建5-10个不断回收的单元格。

虽然一种替代解决方案是使用celltype作为重用标识符,但只创建该类型所需的子视图。这样,当您获得特定类型的单元格时,您知道它将只包含必填字段。这可能会创建更多的单元格,但实际上可能会占用更多内存。