2010-11-18 34 views
1

カスタムセルクラスを作成しています。私はinitメソッドで異なるタイプのサブビューを作成していますが、CGRectZeroとしてフレームを配置しています。私layoutSubviews法で複数の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]; 

、私は私の必要性に基づいてこれらのラベルを使用しています。同様に、あるタイプのセルでは、最初のラベルを使用し、他のタイプでは別のラベルを使用します。

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は、それがそのゲッターを介してアクセスされる最初の時間を表示作成し、コンテンツに付加されています。セルのタイプがそれを必要としないなどゲッターを呼び出さない場合、self.subTitleLabelは決して呼び出されず、subTitleLabelは決して生成されません。

+0

これは完璧に見えます。ありがとう。 – Abhinav

0

ここでのメモリの問題は大きな問題ではないと思います。セルを正しく再利用している場合は、リサイクルされているリストに5〜10個のセルしか作成していない可能性があります。

代わりの解決策の1つは、セルタイプを再利用識別子として使用し、そのタイプに必要なサブビューのみを作成することです。このようにして、特定のタイプのセルを取得すると、必要なフィールドだけが表示されます。実際にはより多くのメモリを消費する可能性がありますが、これにより多くのセルが作成されます。

関連する問題