2010-11-18 68 views
1

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

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)); 
    } 

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

回答

0

如果不是所有的子视图都会用于每种单元格类型,我建议在第一次访问时懒惰地创建每个子视图。这可以通过重写其吸气剂是这样来完成:

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

这种方式,创建subTitleLabel并添加到内容查看第一次是通过其吸气剂进行访问。如果你永远不会调用getter,例如,因为单元格的类型不需要它,self.subTitleLabel将永远不会被调用,并且subTitleLabel永远不会被创建。

+0

这看起来很完美。谢谢。 – Abhinav 2010-11-18 04:31:49

0

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

虽然一种替代解决方案是使用celltype作为重用标识符,并只创建该类型所需的子视图。这样当你得到一个特定类型的单元格时,你知道它只有必需的字段。这可能会创造更多的细胞,但实际上可能会占用更多的记忆。