objective life example containerviewcontroller container iphone objective-c uiviewcontroller initialization

iphone - life - ¿Cuándo debo inicializar un controlador de vista usando initWithNibName?



lifecycle viewcontroller ios (4)

¿Cuándo debería usar init: y cuándo debería usar initWithNibName:bundle: al crear un controlador de vista?


usando init cuando no hay archivo nib / xib, por ejemplo, UI se crean codificando

usando initWithNibName, si tenemos un nib / xib o el mismo controlador compartido en más de 1 nib / xib

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil]; } else { self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil]; }

eso es lo que pienso..


Use initWithNibName si ... está inicializando con un archivo de punta. Es decir, un archivo que creó utilizando Interface Builder.

Si no está utilizando IB para diseñar sus vistas, puede usar init.


Puede llamar a init, siempre que el xib tenga el mismo nombre que la clase de controlador de vista. La encapsulación no es necesaria. Esto ahorra escribir, pero puede no servir claridad.

NUDMainViewController *mainVC = [[NUDMainViewController alloc] init];


-initWithNibName:bundle: es el inicializador designado para UIViewController. Algo eventualmente debería llamarlo. Dicho esto, ya pesar de los ejemplos de Apple (que favorecen la brevedad sobre la capacidad de mantenimiento en muchos casos), nunca debería llamarse desde fuera del controlador de visualización.

A menudo verá código como este:

MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil];

Yo digo que esto es incorrecto. Pone los detalles de implementación (el nombre del NIB y el hecho de que incluso se usa un NIB) en la persona que llama. Eso rompe la encapsulación. La forma correcta de hacer esto es:

MYViewController *vc = [[MYViewController alloc] init];

Luego, en MYViewController:

- (instancetype)init { self = [super initWithNibName:@"Myview" bundle:nil]; if (self != nil) { // Further initialization if needed } return self; } - (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle { NSAssert(NO, @"Initialize with -init"); return nil; }

Esto mueve los detalles de la implementación clave de vuelta al objeto y evita que los llamantes rompan accidentalmente la encapsulación. Ahora bien, si cambia el nombre del NIB o pasa a la construcción programática, lo arregla en un lugar (en el controlador de vista) en lugar de en cada lugar en que se usa el controlador de vista.