2010-11-18 3 views
1

Je crée une classe de cellule personnalisée dans laquelle je place différents types de sous-vues dans ma méthode init mais avec un cadre tel que CGRectZero.Implémentation de plusieurs types 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]; 

Dans ma méthode layoutSubviews, j'utilise ces étiquettes en fonction de mes besoins. Par exemple, pour un type de cellule, j'utiliserai la première étiquette et pour un autre type, j'utiliserai une autre étiquette.

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

Ma question est que c'est une bonne idée de le faire du point de vue de la mémoire. Comme si mon but est résolu mais mon objet de cellule personnalisée contient des sous-vues qui sont dans la mémoire mais pas visibles. Si oui, alors quelle est l'approche alternative pour ce genre de scénario.

Répondre

0

Si toutes les sous-vues ne sont pas utilisées pour chaque type de cellule, je suggère de créer par la paresse chaque sous-vue lors de son premier accès. Cela pourrait se faire en remplaçant son getter comme celui-ci:

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

De cette façon, subTitleLabel est créée et ajoutée au contenu voir la première fois qu'il est accessible par son getter. Si vous n'appelez jamais le getter, par exemple, car le type de cellule ne l'exige pas, self.subTitleLabel ne sera jamais appelé et subTitleLabel ne sera jamais créé.

+0

Cela semble parfait. Merci. – Abhinav

0

Je ne pense pas que les problèmes de mémoire ici seraient un gros problème. Si vous réutilisez correctement les cellules, vous ne créez probablement que 5 à 10 cellules dans votre liste qui sont constamment recyclées.

Bien qu'une solution alternative serait d'utiliser le type de cellule comme identifiant de réutilisation et de créer uniquement les sous-vues nécessaires pour ce type. De cette façon, lorsque vous obtenez une cellule pour un type particulier, vous savez qu'elle aura seulement les champs requis. Cela pourrait créer plus de cellules, ce qui peut effectivement prendre plus de mémoire.

Questions connexes