Je suis assez novice en matière de programmation UI sur Mac et iPhone, et j'ai croisé quelque chose qui me laisse perplexe.L'ordre de l'initialisation et du chargement de UIViewController
A UIViewController a 3 méthodes qui impliquent l'initialisation de celui-ci et son point de vue:
- init (et les méthodes init-analogues)
- loadview
- viewDidLoad (méthode déléguée)
Je m'attendrais à ce que cela se produise dans l'ordre ci-dessus. Le premier UIViewController est alloué par un autre objet, puis init est immédiatement appelé (ou une autre méthode init, comme initWithStyle).
Une fois l'objet initialisé, je m'attendrais à ce qu'il appelle sa propre fonction loadView, après quoi la vue, une fois chargée, appelle la méthode déléguée viewDidLoad.
Cela ne se produit pas, par exemple:
@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
produit la sortie de la console:
0
2
3
1
Les méthodes loadview et viewDidLoad, par conséquent, ne peuvent pas faire des appels de délégué, en tant que délégué est généralement défini après l'appel à [super init], qui (comme indiqué ci-dessus) est appelé après loadView et viewDidLoad ont exécuté:
UIViewControllerSubClass *someViewController = [[UIViewControllerSubclass alloc] init];
[viewController setDelegate:self];
Si je veux exécuter du code qui configure le ViewController d'une manière ou d'une autre, en notifiant le délégué comme il se passe, le code devrait-il résider dans la méthode init? La raison pour laquelle loadView existe n'est-elle pas d'autoriser l'exécution de ce code au moment approprié?
Il me semble que je vais devoir créer une nouvelle méthode initWithDelegate qui définit le délégué Ivar avant appeler, est ce droit, ou je vais sur ce dans le mauvais sens [super init]?
Merci à l'avance :)
Remarque: viewDidUnload est obsolète depuis iOS 6.0. – Brainware