Sobes.tech
Middle

Реци ми о циклусима живота контролера и како се позивају.

sobes.tech АИ

Одговор од АИ

Životni ciklus UIViewController uključuje metode koje se pozivaju u određenim trenucima njegovog postojanja: od kreiranja do uništenja.

Glavne metode životnog ciklusa:

  1. viewDidLoad():

    • Poziva se nakon što je prikaz kontrolera učitan u memoriju, ali pre nego što bude prikazan na ekranu.
    • Koristi se za inicijalizaciju podataka, podešavanje UI elemenata koji nisu zavisni od geometrije prikaza.
    • Poziva se samo jednom tokom životnog veka kontrolera.
  2. viewWillAppear(_ animated: Bool):

    • Poziva se neposredno pre nego što se prikaz kontrolera pojavi na ekranu.
    • Koristi se za zadatke koji treba da se izvršavaju svaki put kada prikaz postane vidljiv (npr. osvežavanje podataka, animacije).
    • Može se pozvati više puta.
  3. viewDidAppear(_ animated: Bool):

    • Poziva se nakon što je prikaz kontrolera potpuno prikazan na ekranu i postao vidljiv korisniku.
    • Pogodno za pokretanje animacija ili drugih zadataka koji zahtevaju da je prikaz potpuno spreman.
    • Može se pozvati više puta.
  4. viewWillDisappear(_ animated: Bool):

    • Poziva se neposredno pre nego što će prikaz kontrolera biti uklonjen sa ekrana (npr. pri prelazu na drugi ekran).
    • Koristi se za čuvanje stanja ili zaustavljanje zadataka koji ne bi trebalo da se izvršavaju dok prikaz nije vidljiv (npr. zaustavljanje tajmera).
    • Može se pozvati više puta.
  5. viewDidDisappear(_ animated: Bool):

    • Poziva se nakon što je prikaz kontrolera potpuno uklonjen sa ekrana.
    • Koristi se za čišćenje resursa ili zaustavljanje zadataka koji više nisu potrebni kada prikaz nije vidljiv.
    • Može se pozvati više puta.
  6. viewWillLayoutSubviews():

    • Poziva se pre nego što kontroler počne da raspoređuje svoje podprikaze.
    • Koristi se za izmene u constraints ili okvirima pre automatskog rasporeda.
    • Može se pozvati više puta.
  7. viewDidLayoutSubviews():

    • Poziva se nakon što kontroler završi sa raspoređivanjem svojih podprikaza.
    • Koristi se za zadatke koji zavise od konačnih dimenzija podprikaza (npr. podešavanje skrol indikatora ili senki).
    • Može se pozvati više puta.
  8. didReceiveMemoryWarning():

    • Poziva se pri niskom nivou memorije.
    • Koristi se za oslobađanje resursa koji mogu biti ponovo kreirani kasnije.
  9. deinit:

    • Poziva se neposredno pre nego što će objekat UIViewController biti uništen i oslobođen iz memorije.
    • Koristi se za izvršenje završnog čišćenja, na primer, brisanje posmatrača ili zatvaranje mrežnih veza.

Redosled poziva:

Tipičan redosled poziva metoda pri pojavljivanju kontrolera:

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

Tipičan redosled poziva metoda pri nestanku kontrolera:

  1. viewWillDisappear(_ animated: Bool)
  2. viewDidDisappear(_ animated: Bool)
  3. deinit (ako kontroler više nije potreban)

Primer implementacije:

import UIKit

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Podešavanje UI, inicijalizacija podataka
        print("viewDidLoad")
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // Ažuriranje UI pre pojavljivanja
        print("viewWillAppear")
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // Nakon pojavljivanja, pokretanje animacija
        print("viewDidAppear")
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // Priprema za nestanak, čuvanje stanja
        print("viewWillDisappear")
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        // Nestanak je završen, čišćenje
        print("viewDidDisappear")
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        // Pre automatskog rasporeda
        print("viewWillLayoutSubviews")
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        // Nakon automatskog rasporeda
        print("viewDidLayoutSubviews")
    }

    deinit {
        // Čišćenje resursa
        print("deinit")
    }
}