Sobes.tech
Middle

Mesélj a vezérlő életciklusairól és arról, hogyan hívják őket.

sobes.tech MI

Válasz az MI-től

Az UIViewController életciklusa olyan metódusokat foglal magában, amelyek meghívásra kerülnek annak létezésének meghatározott pillanataiban: a létrehozástól a megsemmisítésig.

Az életciklus fő metódusai:

  1. viewDidLoad():

    • Akkor hívódik meg, miután a vezérlő nézete betöltődött a memóriába, de még nem jelenik meg a képernyőn.
    • Az adatok inicializálására, UI-elemek beállítására szolgál, amelyek nem függenek a nézet geometriájától.
    • Csak egyszer hívódik meg a vezérlő életében.
  2. viewWillAppear(_ animated: Bool):

    • Közvetlenül a vezérlő nézetének megjelenése előtt hívódik meg.
    • Olyan feladatokra használható, amelyek minden alkalommal, amikor a nézet láthatóvá válik, végrehajtásra kerülnek (pl. adatok frissítése, animációk).
    • Többször is meghívható.
  3. viewDidAppear(_ animated: Bool):

    • Miután a nézet teljesen megjelent a képernyőn, meghívódik.
    • Alkalmas animációk indítására vagy más feladatokra, amelyek megkövetelik, hogy a nézet teljesen készen álljon.
    • Többször is meghívható.
  4. viewWillDisappear(_ animated: Bool):

    • Közvetlenül a nézet eltávolítása előtt hívódik meg (pl. másik képernyőre való váltáskor).
    • A nézet nem látható állapotában végrehajtandó feladatok, például állapot mentése vagy időzítők leállítása céljából használható.
    • Többször is meghívható.
  5. viewDidDisappear(_ animated: Bool):

    • Miután a nézet teljesen eltávolításra került a képernyőről, meghívódik.
    • Erőforrások tisztítására vagy olyan feladatok leállítására, amelyek már nem szükségesek, amikor a nézet nem látható.
    • Többször is meghívható.
  6. viewWillLayoutSubviews():

    • Azt megelőzően hívódik meg, hogy a vezérlő elkezdi elrendezni az alnézeteket.
    • A constraint-ek vagy keretek módosítására szolgál az automatikus elrendezés előtt.
    • Többször is meghívható.
  7. viewDidLayoutSubviews():

    • Miután a vezérlő befejezte az alnézetek elrendezését, meghívódik.
    • Olyan feladatokra alkalmas, amelyek a végső méretektől függenek (pl. görgetősávok vagy árnyékok beállítása).
    • Többször is meghívható.
  8. didReceiveMemoryWarning():

    • Alacsony memóriaállapot esetén hívódik meg.
    • Erőforrások felszabadítására használható, amelyek később újra létrehozhatók.
  9. deinit:

    • Közvetlenül azelőtt hívódik meg, hogy a UIViewController objektum megsemmisül és felszabadul a memóriából.
    • Utolsó tisztítási feladatok végrehajtására, például megfigyelők (observers) törlésére vagy hálózati kapcsolatok lezárására.

Hívási sorrend:

A vezérlő megjelenésekor a metódusok tipikus hívási sorrendje:

  1. viewDidLoad()
  2. viewWillAppear(_ animated: Bool)
  3. viewWillLayoutSubviews()
  4. viewDidLayoutSubviews()
  5. viewDidAppear(_ animated: Bool)

A vezérlő eltűnésekor a metódusok tipikus hívási sorrendje:

  1. viewWillDisappear(_ animated: Bool)
  2. viewDidDisappear(_ animated: Bool)
  3. deinit (ha már nincs szükség rá)

Implementációs példa:

import UIKit

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // UI beállítása, adatok inicializálása
        print("viewDidLoad")
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // UI frissítése megjelenés előtt
        print("viewWillAppear")
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // Megjelenés befejeződött, animációk indítása
        print("viewDidAppear")
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // Előkészítés az eltávolításra, állapot mentése
        print("viewWillDisappear")
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        // Eltávolítás befejeződött, erőforrások tisztítása
        print("viewDidDisappear")
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        // Az auto layout előtt
        print("viewWillLayoutSubviews")
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        // Az auto layout után
        print("viewDidLayoutSubviews")
    }

    deinit {
        // Erőforrások tisztítása
        print("deinit")
    }
}