Soy bastante nuevo en la programación de IU en la Mac y el iPhone, y me he topado con algo que me desconcierta un tanto.Orden de inicialización y carga de UIViewController
A UIViewController tiene 3 métodos que implican la inicialización de la misma y su vista:
- init (y métodos init-como)
- loadView
- viewDidLoad (método delegado)
Espero que ocurran en el orden anterior. El primer UIViewController es asignado por algún otro objeto, luego se llama inmediatamente a init (o a algún otro método init, como initWithStyle).
Solo una vez que se inicializa el objeto, espero que llame a su propia función loadView, después de lo cual la vista, una vez cargada, llama al método de delegado viewDidLoad.
Esto no sucede, por ejemplo:
@implementation UIViewControllerSubclass
- (id)init {
NSLog(@"0");
if (self = [super init]) {
NSLog(@"1");
}
return self;
}
- (void)loadView {
[super loadView];
NSLog(@"2");
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"3");
}
@end
produce la salida de la consola:
0
2
3
1
Los métodos loadView y viewDidLoad, por lo tanto, no se pueden realizar llamadas de delegados, como el delegado es por lo general configurado después de la llamada a [superinicial], que (como se muestra arriba) se llama después de que loadView y viewDidLoad se hayan ejecutado:
UIViewControllerSubClass *someViewController = [[UIViewControllerSubclass alloc] init];
[viewController setDelegate:self];
Si quiero ejecutar el código que configura el ViewController de alguna manera, notificando al delegado como va, ¿debería residir el código en el método init? ¿No es la razón por la que loadView existing permite que dicho código se ejecute en el momento apropiado?
Se Me parece que voy a tener que crear un nuevo método initWithDelegate que establece el Ivar delegado antes de llamar [súper init], es este derecho, o voy de este por el camino equivocado?
Gracias de antemano :)
Nota: viewDidUnload está en desuso a partir de iOS 6.0. – Brainware