¿Cuándo debo llamar? ?

En la publicación Usar initWithNibName no cambia absolutamente nada , muestra dos usos de la misma definición de Nib de vista, en el primer caso, simplemente llama a alloc / init y el segundo, especifica initWithNibName.

Entonces, mientras esto funciona siempre:

MyViewController *vctrlr = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

Lo siguiente funciona para todos los controlleres de vista que he henetworkingado, ¡pero no los míos!

TheirViewController *vctrlr = [[TheirViewController alloc] init]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

Nuevo en la progtwigción de iOS, he henetworkingado un código. Todas las vistas de los controlleres de vista se definen en IB, pero hubo una asignación inconsistente / init de esos controlleres de vista. Creé un nuevo controller de vista y XIB, pero no funciona a less que use initWithNibName (se bloquea cuando presiono el controller de vista en el controller de navigation). No puedo decir cómo mi controller de vista es diferente a los demás … ¿Algún consejo? Pude eliminar el uso de initNibName para todos los demás controlleres de vista de la aplicación, excepto el mío.

Puede pasar cualquier nombre de cadena a initWithNibName: No solo está restringido a llamar a initWithNibName:@"MyClassName" cuando su class se llama MyClassName . Podría ser initWithNibName:@"MyClassNameAlternateLayout" .

Esto se vuelve útil si necesita cargar una punta diferente dependiendo de lo que la aplicación necesite hacer. Si bien trato de tener un controller de punto por vista por categoría de dispositivo (iPhone o iPad) siempre que sea posible para simplificar el desarrollo y el mantenimiento, podría entender si un desarrollador quisiera proporcionar un layout diferente o una funcionalidad diferente a veces.

Otro punto importante es que initWithNibName: bundle: es el inicializador designado para UIViewController . Cuando llama -[[UIViewController alloc] init] , entonces initWithNibName:bundle: se initWithNibName:bundle: entre bastidores. Puede verificar esto con un punto de corte simbólico. En otras palabras, si simplemente desea el comportamiento pnetworkingeterminado, se espera que pueda llamar -[[UIViewController alloc] init] y el inicializador designado se llamará implícitamente.

Sin embargo, si está llamando -[[UIViewController alloc] init] y no obtiene el comportamiento esperado, es probable que su subclass UIViewController haya implementado - (id)init incorrectamente. La implementación debería parecerse a uno de estos dos ejemplos:

 - (id)init { self = [super init]; if (self) { // custom initialization } return self; } 

o

 - (id)init { NSString *aNibName = @"WhateverYouWant"; NSBundle *aBundle = [NSBundle mainBundle]; // or whatever bundle you want self = [self initWithNibName:aNibName bundle:aBundle]; if (self) { // custom initialization } return self; } 
 If you want to work following code: MyViewController *vctrlr = [[MyViewController alloc] inil]; [self.navigationController pushViewController:vctrlr animated:YES]; Then you should implement following both methods in MyViewController: - (id)init { self = [super initWithNibName:@"MyViewController" bundle:nil]; if (self != nil) { // Do initialization if needed } return self; } - (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle { NSAssert(NO, @"Init with nib"); return nil; }