Waarom/wanneer moeten we super.ViewDidLoad bellen?

Iedereen zegt me “Gebruik super.viewDidLoad() omdat het zo is” of “Ik heb het altijd zo gedaan, dus hou het”, “Het is verkeerd als je super niet belt”, enz.

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

Ik heb maar een paar onderwerpen over Objective-C-gevallen gevonden en die waren niet zo verhelderend, maar ik ontwikkel in Swift 3, dus kan een expert me hier een goede gedetailleerde uitleg over geven?

Is het gewoon een kwestie van goed oefenen of zijn er verborgen effecten?


Antwoord 1, autoriteit 100%

Meestal is het een goed idee om super aan te roepen voor alle functies die u negeert en die geen retourwaarde hebben.

U kent de implementatie van viewDidLoadniet. UIViewController zou daar een aantal belangrijke setup-dingen kunnen doen en het niet aanroepen zou het niet de kans geven om zijn eigen viewDidLoad-code uit te voeren.

Hetzelfde geldt voor het erven van een UIViewController-subklasse.

Zelfs als het bellen van super.viewDidLoadniets uithaalt, is het altijd een goede gewoonte om ermee aan de slag te gaan. Als je er een gewoonte van maakt om hem niet te bellen, vergeet je hem misschien te bellen wanneer dat nodig is. Bijvoorbeeld bij het subclasseren van een ViewController die ervan afhankelijk is vanuit een raamwerk van derden of vanuit uw eigen codebasis.

Neem dit gekunstelde voorbeeld:

class PrintingViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("view has loaded")
    }
}
class UserViewController: PrintingViewController {
    override func viewDidLoad() {
    super.viewDidLoad()
     // do view setup here
    }
}

Als je viewDidLoad hier niet aanroept, zou PrintingViewControllernooit de kans krijgen om zijn eigen viewDidLoad-code uit te voeren

Als je niets wilt doen in viewDidLoad, implementeer het dan gewoon niet. De supermethode wordt hoe dan ook aangeroepen.


Antwoord 2, autoriteit 53%

Ik heb een geheim, toen ik bij Apple werkte, las ik de broncode voor UIKit, deels om vragen die ik had als volgt te beantwoorden, viewDidLoadis leeg in alle UI*ViewController-klassen.

p>

Natuurlijk ben ik er niet meer, misschien hebben ze dit veranderd.


Antwoord 3, autoriteit 19%

Ik denk dat het aanroepen van super.viewDidLoad() in de eerste plaats een goede gewoonte is.

Het gebruikelijke in iOS is om al je subklasse-instellingen te doen nadat de superklasse de configuratie heeft voltooid die het moet doen(eigenschappen initialiseren, dingen op een rijtje zetten, enz.). Als je de superklasse niet de kans geeft om al zijn instellingen af ​​te handelen voordat je dingen gaat veranderen, is het mogelijk dat je vreemde bugs en gedrag tegenkomt.

We kunnen een parallel trekken met klasse-initialisatie: “Een aangewezen initialisator moet tot een superklasse-initiator delegeren voordat een waarde wordt toegewezen aan een overgeërfde eigenschap.” We doen dit om er zeker van te zijn dat alle eigenschappen van superklassen een waarde hebben en op basis daarvan kunnen we ze veilig gebruiken via overerving in onze subklasse.

Vuistregel:

  • Voer bij het initialiseren/instellen eerst de implementaties van de superklasse uit.
  • Voer bij het afbreken/opruimen de implementatie van de superklasse als laatste uit.

Ervan uitgaande dat viewDidLoad() een soort initialisatie is, moeten we eerst super.viewDidLoad() aanroepen om de zaken in de superklasse correct in te stellen.

Als we de implementatie van viewDidLoad() in de UIViewController-basisklasse controleren, kunnen we zien dat deze leeg is. Dus misschien is de enige reden om super.viewDidLoad() aan te roepen vanuit je kindklas een goede codeerstijl 🙂 Laten we die volgen!


Antwoord 4, autoriteit 13%

Dat hangt af van de implementatie van viewDidLoadin de klasse UIViewController(waarvan alle view-controllers overerven). Als het leeg is, zal het aanroepen van super.viewDidLoad()niet veel doen. Als het echter enige functionaliteit heeft met betrekking tot de viewcontroller, dan zou je het zeker willen gebruiken.

Aangezien het niet in jouw handen ligt met betrekking tot de implementatie van een UIViewController, moet je deze methode altijd aanroepen


Antwoord 5, autoriteit 6%

Als u rechtstreeks van UIViewControlleroverneemt, bel superwanneer de documentatie u dat zegt.

Bijvoorbeeld viewWillAppear(Bool)zegt: “Als als u deze methode overschrijft, moet u op een bepaald moment in uw implementatie superaanroepen”, terwijl viewDidLoad()niet.

Als u niet rechtstreeks overneemt van UIViewControlleren de klasse waarvan u erft geen betrouwbare documentatie heeft, of stilzwijgend een ingrijpende wijziging introduceert die vereist dat superwordt aangeroepen , bel dan altijd super.


Antwoord 6

Als je klasse rechtstreeks van UIViewController is overgenomen, is het niet nodig om super.viewDidLoad aan te roepen. Dit zorgt er zeker voor dat je code er een beetje beknopt uitziet, maar meestal stelt de iOS-gemeenschap voor om het toch te noemen.

Als je klas is overgenomen van de aangepaste UIViewController, die inderdaad een aantal functies heeft die je klas kan gebruiken, roep dan super.viewDidLoad op.

Other episodes