2010-12-09 3 views
1

Ich habe eine benutzerdefinierte UITableViewCell erstellt, die es aus einer XIB-Datei nach der hilfreichen Anleitung von; How do you load custom UITableViewCells from xib files.Geben Sie verschiedene UITableViewCell-Typen in cellForRowAtIndexPath zurück

Ich möchte nur diese benutzerdefinierte Zelle für die erste Zeile in meinem UITableView, die anderen sind einfache Etiketten und der Standard UITableViewCell ist in Ordnung.

Das Problem ist, wenn ich die benutzerdefinierte Zelle die gesamte UITableView wird nicht angezeigt und der Bildschirm ist leer, mit Ausnahme der Navigationselemente. Wenn Sie nur die Standardzellen verwenden, erscheint die Tabelle in Ordnung, also hat sie etwas mit der benutzerdefinierten Zelle zu tun.

Hier ist der Code, den ich die Zellen zurückgeben muss;

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

Die ArticleDetailCell aus der xib Datei ok und die Eigenschaften erhalten geladen richtig eingestellt, wie ich dies im Debugger sehen kann. Stoppen bei return cell, wenn ich das benutzerdefinierte Zellobjekt von (gdb) drucke ich bekomme;

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

Gibt es ein Problem mit der Zelldereferenzierung? Ich werde immer noch meinen Kopf behalten, zählt und wenn sie es tun und nicht erhöhen.

Warum verschwindet die gesamte UITableView wegen eines Problems mit einer einzelnen Zelle?

EDIT: FYI @BoltClock

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

Nur ein Quickie: in Ihre if-Anweisung, wenn Sie Ihre Etiketten anpassen, Sie müssen nicht gegossen 'cell' zu' ArticleDetailCell' jeder Zeit, weil Sie bereits deklarieren und als 'ArticleDetailCell' initialisieren. Wie sehen Ihre Methoden 'enableTableCell:' und 'disableTableCell:' aus? – BoltClock

+0

@BoltClock danke für den Refactoring-Hinweis, muss das in, bevor ich das Problem beim Erstellen der benutzerdefinierten Zelle als nur ein UITableViewCell –

+0

@BoltClock hinzugefügt die disableTableCell-Methode zu Frage (aktiviert ist fast das gleiche, aber andere Werte verwendet). –

Antwort

1

Das Problem lag hauptsächlich mit der XIB-Datei für die benutzerdefinierte Zelle. Striktes Folgen von Loading Custom Cells from NIB Files vom Apple Developer Center hat den Trick gemacht.

Der Schlüssel war, um die File's Owner in der benutzerdefinierten Zelle, um die Art von UITableViewController wo ich die Zelle verwenden würde. Die UITableViewController hatte auch eine IBOutlet Eigenschaft für die benutzerdefinierte UITableViewCell, die zum Verbinden der File's Owner mit der benutzerdefinierten Zelle in der XIB-Datei verwendet wurde.

Wichtigerweise wurde die Kennung in der XIB-Datei für die Tabellenansichtszelle festgelegt, sodass sie mit dem in der dequeueReusableCellWithIdentifier-Methode verwendeten Wert übereinstimmt.

Die cellForRowAtIndexPath endete wie folgt, wobei articleDetail die IBOutlet Eigenschaft ist;

- (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

Wo ist reuseIdentifier definiert? Steht diese Methode immer zur Verfügung?

+0

Ja, es ist nur ein statischer NSString innerhalb der UIViewController-Implementierung. –

Verwandte Themen