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
Oh, de acuerdo. Reemplazar 'initWithCoder' con' awakeFromNib' parece funcionar como se esperaba. ¡Muchas gracias! – Ryan
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
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. –