2010-12-09 11 views
1

J'ai créé un fichier personnalisé UITableViewCell le chargeant à partir d'un fichier xib suivant les conseils utiles de; How do you load custom UITableViewCells from xib files.Retourne différents types UITableViewCell dans cellForRowAtIndexPath

Je veux seulement cette cellule personnalisée pour la première rangée dans mon UITableView, les autres sont des étiquettes simples et le UITableViewCell standard est très bien.

Le problème est que lorsque j'inclue la cellule personnalisée, la totalité de UITableView n'est pas affichée et l'écran est vide à l'exception des éléments de navigation. En utilisant seulement les cellules standard, la table apparaît bien, donc c'est quelque chose à voir avec la cellule personnalisée.

Voici le code que je dois retourner les cellules;

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

    if(indexPath.row == 0) { 
     ArticleDetailCell *cell = (ArticleDetailCell *)[tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%@Detail", reuseIdentifier]]; 

     if(!cell) { 
      // Load the top-level objects from the custom cell XIB. 
      NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ArticleDetailCell" owner:self options:nil]; 
      // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain). 
      cell = (ArticleDetailCell *)[topLevelObjects objectAtIndex:0]; 
     } 

     [[(ArticleDetailCell *)cell judges] setText:[[self caseBaseArticle] judges]]; 
     [[(ArticleDetailCell *)cell judgementDate] setText:[[self caseBaseArticle] judgmentDate]]; 
     [[(ArticleDetailCell *)cell court] setText:[[self caseBaseArticle] court]]; 

     return cell; 

    } else {  
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 

     if(!cell) { 
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease]; 
      [[cell textLabel] setNumberOfLines:1]; 
      [[cell textLabel] setFont:[UIFont systemFontOfSize:14]]; 
      [[cell textLabel] setText:articleRowTitles[indexPath.row-1]]; 
     } 

     if ([self tableRowHasContentDetail:indexPath]) { 
      [self enableTableCell:&cell]; 
     }else { 
      [self disableTableCell:&cell]; 
     }  

     return cell; 
    } 
} 

Le ArticleDetailCell est chargé à partir du fichier ok et les xib propriétés se régler correctement comme je peux le voir dans le débogueur. Arrêt à return cell lorsque j'imprime l'objet de cellule personnalisé de (gdb) Je reçois;

<ArticleDetailCell: 0x4bc22b0; baseClass = UITableViewCell; frame = (0 0; 320 367); autoresize = W+TM+BM; layer = <CALayer: 0x4bc23c0>> 

Y a-t-il un problème avec le déréférencement des cellules? Je vais quand même garder la tête pour retenir les comptes et quand ils le font et ne pas augmenter.

Pourquoi l'intégralité de UITableView disparaît-elle à cause d'un problème avec une seule cellule?

EDIT: Pour votre information @BoltClock

- (void)disableTableCell:(UITableViewCell **)cell { 
    [*cell setAccessoryType:UITableViewCellAccessoryNone]; 
    [*cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    [[*cell textLabel] setTextColor:[UIColor lightGrayColor]]; 
} 
+0

Juste un quickie: dans votre déclaration si lorsque vous personnalisez vos étiquettes, vous ne devez pas jeter '' cell' à ArticleDetailCell' chaque fois que vous déclarez déjà et lsinitialisez comme 'ArticleDetailCell'. À quoi ressemblent vos méthodes 'enableTableCell:' et 'disableTableCell:'? – BoltClock

+0

@BoltClock merci pour l'indice de refactoring, doit avoir laissé cela avant d'avoir résolu le problème en créant la cellule personnalisée comme seul un UITableViewCell –

+0

@BoltClock a ajouté la méthode disableTableCell à la question (l'activation est presque la même mais utilise des valeurs différentes). –

Répondre

1

Le problème était principalement avec le fichier xib pour la cellule personnalisée. Strict suite de Loading Custom Cells from NIB Files de l'Apple Developer Center a fait l'affaire.

L'élément clé était de définir le File's Owner dans la cellule personnalisée pour être le type de UITableViewController où j'utiliserais la cellule. Le UITableViewController avait également une propriété IBOutlet pour le UITableViewCell personnalisé qui a été utilisé pour connecter le File's Owner à la cellule personnalisée dans le fichier xib. Il est important de noter que l'identificateur a été défini dans le fichier xib de la cellule Table View afin qu'il corresponde à la valeur utilisée dans la méthode dequeueReusableCellWithIdentifier.

Le cellForRowAtIndexPath s'est terminé comme ceci où articleDetail est la propriété IBOutlet;

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

    if(indexPath.row == 0) { 
     ArticleDetailCell *cell = (ArticleDetailCell *)[tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%@Detail",reuseIdentifier]]; 

     if(!cell) { 
      [[NSBundle mainBundle] loadNibNamed:@"ArticleDetailCell" owner:self options:nil]; 
      cell = articleDetail; 
      [self setArticleDetail:nil]; 
     } 

     [[cell judges] setText:[[self caseBaseArticle] judges]]; 
     [[cell judgementDate] setText:[[self caseBaseArticle] judgmentDate]]; 
     [[cell court] setText:[[self caseBaseArticle] court]]; 

     return cell; 

    } else {  
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 

     if(!cell) { 
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease]; 
      [[cell textLabel] setNumberOfLines:1]; 
      [[cell textLabel] setFont:[UIFont systemFontOfSize:14]]; 
      [[cell textLabel] setText:articleRowTitles[indexPath.row-1]]; 
     } 

     if ([self tableRowHasContentDetail:indexPath]) { 
      [self enableTableCell:&cell]; 
     }else { 
      [self disableTableCell:&cell]; 
     }  

     return cell; 
    } 
} 
1

Où est reuseIdentifier défini? Est-il toujours disponible pour cette méthode?

+0

oui c'est juste un NSString statique dans l'implémentation de UIViewController. –