2012-08-13 13 views
19

Tengo una subclase de UITableViewCell. Mi subclase contiene varios UILabel s. Quiero que mi subclase inicialice estas etiquetas con algunas configuraciones predeterminadas que se aplican a todas las celdas de la vista de tabla.¿Por qué initWithCoder no está inicializando los elementos correctamente?

He leído que debería usar initWithCoder para esto. Se está llamando a mi función initWithCoder, y puedo pasar por cada línea en mi función y parece seguir los movimientos. Sin embargo, cuando ejecuto mi aplicación, no veo ninguna de las propiedades que se están aplicando. Lo más notable es que la fuente no está siendo cambiada. Simplemente no creo que ninguna de las propiedades que estoy modificando en mi UILabel s en realidad se están guardando, o se muestran.

Estoy usando esta subclase junto con un Storyboard. Sé que mis cambios no se reflejarán en el Storyboard, pero tampoco se reflejan cuando se ejecuta la aplicación, a pesar de que se esté ejecutando mi código.

Editar: Quería mencionar que antes de intentar sobreescribir initWithCoder, tenía un método de instancia en estas subclases en el que había ejecutado esta lógica. Simplemente llamaría a ese método de instancia dentro de cellForRowAtIndexPath. Este método funcionaba, pero pensé que sería útil tener esta lógica en esta subclase ocurriendo automáticamente.

¿Alguna idea? Mi código es el siguiente:

#import "ThreadListCell.h" 

@implementation ThreadListCell 

- (id)initWithCoder:(NSCoder *)aDecoder { 

    if ((self = [super initWithCoder:aDecoder])) { 

     // adjust the font settings of the title 
     self.title.font = [UIFont fontWithName:@"SourceSansPro-Black" size:16]; 
     self.title.textColor = [UIColor colorWithWhite:0.267f alpha:1.0f]; 

     // adjust the font settings of the subtitle 
     self.text.font = [UIFont fontWithName:@"SourceSansPro-Light" size:14]; 
     self.text.textColor = [UIColor colorWithWhite:0.267f alpha:0.9f]; 
     self.text.textColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1]; 

     // adjust the font settings of the location 
     self.location.font = [UIFont fontWithName:@"SourceSansPro-Light" size:8]; 
     self.location.textColor = [UIColor colorWithWhite:0.267f alpha:0.9f]; 

     // adjust the UILabel settings of the title 
     self.title.numberOfLines = 0; 
     self.title.lineBreakMode = UILineBreakModeTailTruncation; 

     // adjust the UILabel settings of the subtitle 
     self.text.numberOfLines = 0; 
     self.text.lineBreakMode = UILineBreakModeTailTruncation; 

     // adjust the UILabel settings of the location 
     self.location.numberOfLines = 0; 
     self.location.lineBreakMode = UILineBreakModeTailTruncation; 
     self.location.textAlignment = UITextAlignmentRight; 

    } 

    return self; 

} 

@end 

Y el encabezado:

#import <UIKit/UIKit.h> 

@interface ThreadListCell : UITableViewCell 

@property (nonatomic, weak) IBOutlet UILabel *text; 
@property (nonatomic, weak) IBOutlet UILabel *title; 
@property (nonatomic, weak) IBOutlet UILabel *location; 

@end 

Respuesta

45

Ninguno de sus IBOutlets se establece al recibir el mensaje - es necesario utilizar "awakeFromNib" o "viewDidLoad" - algo por el estilo - para acceder a sus puntos de venta. Dicho esto, puede configurar otras cosas que no sean de salida en el initWithCoder.

+1

Oh, de acuerdo. Reemplazar 'initWithCoder' con' awakeFromNib' parece funcionar como se esperaba. ¡Muchas gracias! – Ryan

+0

Aunque, parece que 'awakeFromNib' ocurre antes de configurar cualquiera de mis propiedades en' cellForRowAtIndexPath'. Esto me hace pensar que tal vez mi método de instancia fue el mejor enfoque, porque podía realizar operaciones de cambio de tamaño de manera confiable en base al texto actual en un 'UILabel', etc. – Ryan

+3

El orden debería ser: initWithCoder, awakeFromNib, cellForRowAtIndexPath. Si necesita "preestablecer" algunos valores matemáticos, puede hacerlo en la rutina de inicio. Pero no tiene acceso a sus puntos de venta hasta que la punta esté cargada. –

Cuestiones relacionadas