2013-06-06 14 views
7

Ich habe ein paar Probleme mit einem benutzerdefinierten UITableViewCell und wie man Dinge mit Storyboards verwalten. Wenn ich den Styling-Code in initWithCoder: setze funktioniert es nicht, aber wenn ich es in tableView: cellForRowAtIndexPath: stecke funktioniert es. Im Storyboard habe ich eine Prototyp-Zelle, deren Klassenattribut auf meine benutzerdefinierte Klasse UITableViewCell gesetzt ist. Jetzt wird der Code in initWithCoder: aufgerufen.Styling benutzerdefinierte UITableViewCell in InitWithCoder: funktioniert nicht

SimoTableViewCell.m

@implementation SimoTableViewCell 

@synthesize mainLabel, subLabel; 

-(id) initWithCoder:(NSCoder *)aDecoder { 
    if (!(self = [super initWithCoder:aDecoder])) return nil; 

    [self styleCellBackground]; 
    //style the labels 
    [self.mainLabel styleMainLabel]; 
    [self.subLabel styleSubLabel]; 

    return self; 
} 

@end 

TableViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"NearbyLandmarksCell"; 
    SimoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    //sets the text of the labels 
    id<SimoListItem> item = (id<SimoListItem>) [self.places objectAtIndex:[indexPath row]]; 
    cell.mainLabel.text = [item mainString]; 
    cell.subLabel.text = [item subString]; 

    //move the labels so that they are centered horizontally 
    float mainXPos = (CGRectGetWidth(cell.contentView.frame)/2 -  CGRectGetWidth(cell.mainLabel.frame)/2); 
    float subXPos = (CGRectGetWidth(cell.contentView.frame)/2 - CGRectGetWidth(cell.subLabel.frame)/2); 
    CGRect mainFrame = cell.mainLabel.frame; 
    mainFrame.origin.x = mainXPos; 
    cell.mainLabel.frame = mainFrame; 
    CGRect subFrame = cell.subLabel.frame; 
    subFrame.origin.x = subXPos; 
    cell.subLabel.frame = subFrame; 

    return cell; 
} 

ich den Code gedebuggt haben und festgestellt, dass die dequeue... zuerst genannt wird, dann geht es in die initWithCoder: und dann Zurück zum View-Controller-Code. Was merkwürdig ist, ist, dass die Adresse der Zelle im Speicher zwischen return self; wechselt und wenn es zurück zum Controller geht. Und wenn ich den Styling-Code nach dequeue... zurück zum View-Controller verschiebe, funktioniert alles einwandfrei. Ich möchte nicht unnötiges Styling bei der Wiederverwendung von Zellen machen.

Prost

Antwort

12

Nach initWithCoder: auf der Zelle genannt wird, wird die Zelle gegründet und hat seine Eigenschaften festgelegt. Aber die Beziehungen in der XIB (die IBOutlets) auf der Zelle sind noch nicht abgeschlossen. Also, wenn Sie versuchen, mainLabel zu verwenden, ist es eine nil Referenz.

Verschieben Sie stattdessen Ihren Styling-Code in die awakeFromNib-Methode. Diese Methode wird aufgerufen, nachdem die Zelle nach dem Entpacken der XIB erstellt und vollständig konfiguriert wurde.

Verwandte Themen