59 votes

Pourquoi / quand devons-nous appeler super.ViewDidLoad?

Tout le monde me dit "Utilisez super.viewDidLoad () parce que c'est comme ça" ou "Je l'ai toujours fait comme ça, alors gardez-le", "C'est faux si vous n'appelez pas super", etc.

 override func viewDidLoad() {
    super.viewDidLoad()
    // other stuff goes here
}
 

Je n'ai trouvé que quelques sujets sur les cas Objective-C et ils n'étaient pas très instructifs, mais je développe dans Swift 3, alors n'importe quel expert peut-il me donner une bonne explication détaillée à ce sujet?

S'agit-il uniquement de bonnes pratiques ou y a-t-il des effets cachés?

51voto

tsp Points 710

Habituellement, c'est une bonne idée d'appeler super pour toutes les fonctions que vous remplacez qui n'ont pas de valeur de retour.

Vous ne connaissez pas la mise en œuvre de l' viewDidLoad. UIViewController pourrait faire une importante installation de trucs et pas d'appel il ne serait pas lui donner la possibilité de lancer sa propre viewDidLoad code.

C'est la même chose lorsque vous héritez d'une sous-classe UIViewController.

Même si vous appelez super.viewDidLoad ne fait rien, toujours appeler c'est une bonne habitude à prendre. Si vous prenez l'habitude de vous pas de l'appeler, vous risquez d'oublier de l'appeler quand il le faut. Par exemple, lorsque le sous-classement d'un ViewController qui dépend d'un 3ème partie-cadre ou à partir de votre propre base de code.

Prenez cet exemple artificiel:

class PrintingViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("view has loaded")
    }
}

class UserViewController: PrintingViewController {
    override func viewDidLoad() {
    super.viewDidLoad()

     // do view setup here
    }

}

Ne pas appeler viewDidLoad ici ne serait jamais donner des PrintingViewController chance de lancer sa propre viewDidLoad code

Si vous ne voulez pas faire n'importe quoi en viewDidLoad il suffit de ne pas la mettre en œuvre. La super méthode sera appelée de toute façon.

27voto

mxcl Points 5921

J'ai un secret: lorsque j'ai travaillé chez Apple, j'ai lu le code source de UIKit, en partie pour répondre à des questions comme celle-ci: viewDidLoad est vide dans toutes les classes UI * ViewController.

Naturellement je ne suis plus là, ils ont peut-être changé cela.

9voto

Vitya Shurapov Points 698

Je pense que l'appel à super.viewDidLoad() est, tout d'abord, une bonne pratique.

La chose habituelle dans iOS est de faire tout de votre sous-classe des configurations après la classe mère a terminé la configuration qu'il doit faire (initialisation des propriétés, l'agencement, etc.). Si vous ne donnez pas la superclasse une chance de traiter l'ensemble de ses configurations avant de commencer à changer les choses autour, il est possible que vous rencontriez quelques bugs étranges et de comportement.

On peut dresser un parallèle avec l'Initialisation de Classe: "désigné Un initialiseur doit déléguer à une super-classe d'initialiseur avant affectation d'une valeur à une propriété héritée." Nous faisons ceci pour être sûr que tous les super-classe de propriétés ont une valeur, et basé sur ce fait, on pourrait les utiliser en toute sécurité par le biais de l'héritage dans notre sous-classe.

Règle de base:

  • Lors de l'initialisation/la configuration, exécutez la superclasse de mise en œuvre de la première.
  • Quand déchirer vers le bas/le nettoyage, exécutez la super-classe de mise en œuvre de la dernière.

En supposant que viewDidLoad() est une sorte d'initialisation, nous devrions l'appeler super.viewDidLoad() tout d'abord à définir correctement les choses dans la superclasse.

Si l'on contrôle la mise en œuvre de viewDidLoad() dans UIViewController de la classe de base, nous pouvons voir qu'il est vide. Alors peut-être la seule raison d'un appel à super.viewDidLoad() de la classe enfant est un bon style de codage :-) vous Permet de suivre!

7voto

giorashc Points 8238

Cela dépend de l'implémentation de viewDidLoad dans la classe UIViewController (dont tous les contrôleurs de vue héritent). S'il est vide, appeler super.viewDidLoad() ne fera pas grand chose. Cependant, si certaines fonctionnalités du contrôleur de vue sont utilisées, vous voudrez certainement les utiliser.

Comme la mise en œuvre d'un UIViewController n'est pas entre vos mains, vous devriez toujours appeler cette méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X