Función que se invoca cuando UILabel se inicializa

Estoy intentando subclass UILabel . El primer bash implica que mi UILabel personalizado simplemente establece la propiedad adjustsFontSizeToFitWidth en YES . El problema es que soy nuevo en la progtwigción de iOS y no estoy seguro de dónde colocar este código. Probé el código a continuación pero nunca se llaman.

 - (id)initWithFrame:(CGRect)frame { NSLog(@"init custom label"); self = [super initWithFrame:frame]; if (self) { // Initialization code self.adjustsFontSizeToFitWidth=YES; } return self; } - (id)init { NSLog(@"init custom label"); self = [super init]; if (self) { // Initialization code here. self.adjustsFontSizeToFitWidth=YES; } return self; } 

Lo puse a funcionar usando:

 lblCustom = [lblCustom init]; 

¿Pero de alguna manera puedo hacer que esta llamada sea llamada automáticamente?

Cuando se usa una label en el generador de interfaces, entonces el código usa el protocolo NSCoder :

 - (id)initWithCoder:(NSCoder *)aDecoder { NSLog(@"init custom label"); self = [super initWithCoder:aDecoder]; if (self) { // Initialization code here. self.adjustsFontSizeToFitWidth=YES; } return self; } 

Lo que hago es crear un método para configurar mi object UI personalizado y dejar que todos los init llamen a este método.

Personalmente, me mantendría alejado de initWithCoder: y en su lugar, awakeFromNib en awakeFromNib lugar. Este es el motivo ( Apple UIKit Documentation ):

La infraestructura de carga de nib envía un post awakeFromNib a cada object recreado desde un file de nib, pero solo después de que todos los objects del file se hayan cargado e inicializado. Cuando un object recibe un post awakeFromNib, se garantiza que ya se han establecido todas sus conexiones de salida y acción.

Tengo una variedad de subclasss de UI en mi progtwig y aquí está la solución que encontré en mi class BaseLabel .

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if(self) { // We were not loaded from a NIB [self labelDidLoad:NO]; } return self; } - (void)awakeFromNib { [super awakeFromNib]; // We were loaded from a NIB [self labelDidLoad:YES]; } - (void)labelDidLoad:(BOOL)loadedFromNib { // Do some initialization here... } 

Ahora todas mis subclasss simplemente anulan {type}didLoad:(BOOL)loadedFromNib .

Por ejemplo, textFieldDidLoad: y tableViewDidLoad: (obtienes la idea).

Llamar solo a init en una UIView es lo mismo que llamar a initWithFrame: con un cero-rect. Por lo tanto, debe anular initWithFrame o initWithCoder si está utilizando nib-files.