2010-08-06 7 views
0

J'ai donc une tableviewcells personnalisée configurée par programme. J'ai 4 classes de cellules personnalisées, une cellule personnalisée pour une section. Mais je ne sais pas si c'est faux ou non:iPhone - Création d'un tableau personnalisé par programmation

(UITableViewCell *)tableView:(UITableView *)TheTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 


    static NSString *ShopsIdentifier = @"ShopsIdentifier"; 
    static NSString *DescriptionsIdentifier = @"DescriptionsIdentifier"; 
    static NSString *ServicesIdentifier = @"ServicesIdentifier"; 
    static NSString *PartnersIdentifier = @"PartnersIdentifier"; 


    if (indexPath.section == kShops) { 
     NSLog(@"Chargement cellule ShopDetailCell"); 
     ShopDetailCell * shopshopCell = (ShopDetailCell *)[tableView dequeueReusableCellWithIdentifier:ShopsIdentifier]; 
     if (shopCell == nil) { 
      shopCell = [[[ShopDetailCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ShopsIdentifier] autorelease]; 
     } 
     shopCell.detailController = self; 
     shopCell.shop = self.shop; 
     return shopCell; 

    } 

    if (indexPath.section == kDescriptions) { 
     NSLog(@"Chargement cellule DescriptionCell"); 
     DescriptionCell * descriptionCell = (DescriptionCell *)[tableView dequeueReusableCellWithIdentifier:DescriptionsIdentifier]; 
     if (descriptionCell == nil) { 
      descriptionCell = [[[DescriptionCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:DescriptionsIdentifier] autorelease]; 
     } 
     descriptionCell.shop = self.shop; 
     return descriptionCell; 

    } 
    if (indexPath.section == kServices) { 
     NSLog(@"Chargement cellule ServicesCell"); 
     ServicesCell * servicesCell = (ServicesCell *)[tableView dequeueReusableCellWithIdentifier:ServicesIdentifier]; 
     if (servicesCell == nil) { 
      servicesCell = [[[ServicesCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ServicesIdentifier] autorelease]; 
     } 
     servicesCell.shop = self.shop; 
     return servicesCell; 
    } 

    if (indexPath.section == kPartners) { 
     PartnersCell * partnersCell = (PartnersCell *)[tableView dequeueReusableCellWithIdentifier:PartnersIdentifier]; 
     if (partnersCell == nil) { 
      partnersCell = [[[PartnersCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:PartnersIdentifier] autorelease]; 
     } 
     NSMutableDictionary * aPartner = [[NSMutableDictionary alloc] init]; 
     aPartner = [shop.partners objectAtIndex:indexPath.row]; 
     partnersCell.partner = aPartner; 
     [aPartner release]; 
     return partnersCell; 
    } 

    return nil; 
} 
+0

vous pourriez perdre le mot-clé 'static'. mais ça marche? parce que ça a l'air ok. – mvds

+0

Oui ça marche. Mais il échoue quand je veux enlever les cellules ou en créer de nouvelles. –

Répondre

0

Si vous avez créé ces cellules personnalisées dans le même fichier NIB que le contrôleur, je trouve la meilleure chose à faire est de créer une référence à (les déclarer) et leur créer un débouché. Vous ne voulez pas supprimer les cellules ou en créer de nouvelles car vous n'avez qu'une seule et unique instance de votre cellule personnalisée. (Si vous avez besoin de plus d'instances de votre cellule personnalisée, vous devez les créer dans un fichier nib distinct et utiliser le mécanisme de file d'attente.)

dans le fichier .h: UITableViewCell IBOutlet * shopDetailCell;

Puis, en cellForRowAtIndexPath vous pouvez juste:

UITableView *cell; 

if (indexPath.row == kShopCellRow) { 
    cell = self.shopDetailCell; 
    cell.shop = self.shop; // etc. whatever initialization you have to do 
    return cell;   // do this at the end of your if statements. 
} 
+0

Oui, mais je n'utilise pas de fichier NIB. Je me suis mis en place par programme, sans IB. –

+0

La même idée est valable, vous devriez avoir une référence aux cellules. Le mécanisme de file d'attente est utilisé lorsque vous utilisez beaucoup de cellules du même type afin que le système puisse décider si elles doivent être réutilisées ou recréées. – joelm

1

Ce code est erroné:

NSMutableDictionary * aPartner = [[NSMutableDictionary alloc] init]; 
aPartner = [shop.partners objectAtIndex:indexPath.row]; 
partnersCell.partner = aPartner; 
[aPartner release]; 

Besoin:

partnersCell.partner = [shop.partners objectAtIndex:indexPath.row]; 
+0

Oui, je l'ai oublié. –

Questions connexes