Crear un método personalizado de inicio de UIView con parameters

Estoy buscando para saber cómo UIView correctamente UIView con un método de inicio personalizado que pasa parameters.

He leído la documentation de reference de la class UIView aquí: https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html

En la actualidad, la UIView se está creando en el UIViewController y se puede mover / refactorizar en su propia subclass. También en la actualidad, la vista se crea completamente en código y el cuadro se calcula mediante las restricciones añadidas a la vista misma.

La documentation dice lo siguiente

initWithFrame: – Se recomienda implementar este método. También puede implementar methods de initialization personalizados además de este método o en lugar de hacerlo.

Pregunta
Como no creo un marco como punto de partida para la vista / ninguno está cargado desde un XIB, ¿cuál es el process correcto para subclasificarlo?

Sería esto correcto:

 -(id)init { NSLog(@"%s",__PRETTY_FUNCTION__); self = [super init]; if (self) { // Init code [self spmCustomInit]; } return self; } -(void)spmCustomInit { NSLog(@"%s",__PRETTY_FUNCTION__); } 

Si esto es correcto, necesito seguir cambiando esto. Cuando se crea la vista crea algunas subvenciones basadas en información. Además, el layout es diferente en function de un nivel de dificultad. Otra pregunta
¿Cómo creo un método de inicio personalizado adicional que paso en parameters?
Por ejemplo, si he creado un método llamado

 spmInitWithWord:(NSString *)word difficulty:(GameTurnDifficulty)difficulty 

¿Cómo se llama al método init estándar? ¿Entonces llamaría a este init personalizado al crear la vista inicialmente también? [[UICustomViewExample alloc] spmInitWithWord:testWord difficulty:turnDifficulty] ??

No, sugeriría un enfoque diferente. Escribe tu método init para llamar a super initWithFrame. Ese es el inicializador designado para UIView. Al llamarlo usted mismo, se asegura de que se invoca cualquier configuration del sistema operativo que deba llevarse a cabo.

Puede pasar CGRectZero como marco si lo necesita, y luego establecer el marco más tarde.

Tenga en count que también debe planear admitir la initialization mediante initWithCoder. Ese es el método que se llama si coloca su vista en un file XIB o Storyboard.

Lo que hago es crear un método doInitSetup, y poner allí mi initialization personalizada. Luego llamo a ese método desde initWithFrame e initWithCoder.

En su caso, puede agregar properties para su configuration personalizada, y si coloca una de sus vistas en un XIB / Storyboard, puede establecer esas properties utilizando los attributes de time de ejecución del usuario.

Usar IB para diseñar sus formularios es una buena idea. Te aconsejaría que aprendas a usarlos. Hacen que sea más fácil y le dan acceso a funciones que son casi imposibles de usar desde el código.

Su código podría verse así:

 - (id) initWithWord: (NSString *) theWord { self = [super initWithFrame: CGRectZero]; if (!self) return nil; [self doInitSetupWithWord: theWord]; return self; } - (void) doInitSetupWithWord: (NSString *) theWord { //Do whatever you need to do to set up your view. } - (id) initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder: aDecoder]; if (!self) { return nil; } [self doInitSetupWithWord: nil]; return self; } - (void) setWord: (NSString *) theWord { _theWord = theWord; //If possible, set things up for the new word } 

Digamos que su método personalizado es el siguiente

 -(instancetype) initWithFrame:(CGRect)frame base:(UIColor *)base textColor:(UIColor *)textColor { if(self = [super initWithFrame:frame]) { self.backgroundColor = base; self.label.textColor = textColor; } return self; } 

La condición if crea su object UIView, que puede personalizar más según sus parameters. Puede utilizar el método initWithFrame: o init, lo que prefiera o funcione para su caso de uso.