web-dev-qa-db-fra.com

Dois-je toujours appeler [super viewDidLoad] dans la méthode -viewDidLoad?

Dans l'exemple ScrollView d'Apple, ils n'appellent pas cela. J'ai toujours pensé que c'était un doit . Pourquoi devrais-je appeler quand même?

52
Thanks

Si vous substituez la méthode, vous devez quand même appeler la méthode dans le super. Même si la super classe ne fait rien avec elle aujourd'hui, Apple pourrait un jour changer la mise en œuvre et votre code cesserait mystérieusement de fonctionner. Si vous n'avez vraiment pas besoin de faire quoi que ce soit avec cette méthode, laissez-le en dehors de votre code et la méthode de super fonctionnera comme d'habitude, sans aucune intervention de votre part.

49
George Armhold

Non, vous n'avez pas besoin d'appeler [super viewDidLoad]. Edit: Mais lisez ci-dessous, parce que je pense que vous êtes définitivement devrait.

Soyons réalistes ici: Apple ne va pas casser des milliers d'applications, y compris celles basées sur leur exemple de code publié, en décidant qu'un événement qu'elles ne gèrent pas actuellement doit faire quelque chose que les développeurs peuvent ou non vouloir arrêter et c'est Il est essentiel de ne pas arrêter l'événement si vous n'avez pas besoin d'un comportement différent.

Éditer: Après avoir observé comment Apple gère la compatibilité pendant une année supplémentaire, je recommande maintenant d'apprendre et d'utiliser le modèle correct. Bien que je doute que le binaire de votre application cesse de fonctionner soudainement, il est clair que l'iPhone détecte le SDK sur lequel votre binaire a été construit et modifie certains comportements du système d'exploitation en fonction de cela.

Apple pourrait un jour exiger qu'un modèle particulier soit suivi sur un futur SDK. Cela ne vous affectera pas tant que vous ne reconstruirez pas avec le dernier Xcode + SDK, mais vous obtiendrez ces interruptions sans aucune modification du code source. Apprendre et suivre le modèle pour être en sécurité.

29
Steven Fisher

Comme Markus le dit, UIViewController ne fait rien dans sa méthode viewDidLoad, vous n'avez donc pas à l'appeler. Cependant, c'est une bonne habitude à prendre, si vous modifiez votre structure d'héritage et que la classe qui héritait de UIViewController hérite désormais de quelque chose que fait fait quelque chose dans la méthode viewDidLoad.

17
Paul Tomblin

Disons que vous avez 2 cours, un parent et un enfant. L'enfant hérite du parent. Ils ont une méthode appelée saluer qui retourne une chaîne.

Voici à quoi ressemble la méthode parente:

Code:

-(NSString *)greet {
   return @"Hello";
}

Nous voulons que l'enfant apprenne de ses parents. Nous utilisons donc super pour dire saluer comment Maman saluerait, mais avec nos propres petits ajouts aussi.

Code: // Hérite du parent

-(NSString *)greet {
  NSString *parentGreeting = [super greet];
  return [parentGreeting stringByAppendingString:@", Mommy"]
}

Alors maintenant, le parent salue "Bonjour", et l'enfant salue "Bonjour, maman". Plus tard, si nous modifions le message d'accueil du parent pour qu'il ne renvoie que "Salut", les deux classes seront affectées et vous obtiendrez "Salut" et "Salut, maman".

super est utilisé pour appeler une méthode telle que définie par une superclasse. Il est utilisé pour accéder aux méthodes qui ont été remplacées par des sous-classes afin que la classe puisse envelopper son propre code autour d'une méthode implémentée par sa classe parente. C'est très pratique si vous faites un héritage quelconque.

11
suthar

La documentation d'Apple pour viewDidLoad n'indique PAS que vous devriez appeler [super viewDidLoad], aussi j'irais avec ce que dit Apple. Notez cependant que pour d'autres méthodes similaires, telles que viewDidAppear, vous devez appeler [super viewDidAppear].

10
Daniel

Vous n'êtes pas obligé d'appeler le [super viewDidLoad]

Autant que je sache, viewDidLoad dans la super-classe (UIViewController) est uniquement une fonction vide appelée lorsque le ViewController est initialisé avec un fichier nib. 

Ainsi, si vous devez effectuer une initialisation, vous devez remplacer cette fonction et y placer votre code.

9
ullmark

Je viens de remarquer que l'analyseur statique de Xcode 6 émet un avertissement si vous n'appelez pas super dans ces fonctions. Il semblerait donc qu'Apple veuille maintenant que nous l'appelions.

5
Klaus Thul

Bien que dans xCode 7 Beta/Swift 2, super.viewDidLoad ne se compile pas. L'erreur indique qu'il est uniquement disponible dans osx 10.10 et que le correctif automatique le fait.

if #available(OSX 10.10, *){
super.viewDidLoad()}
else
{
// Fallback on earlier versions
}
// My code
}
0
ian