viewDidLoad — az első metódus, amelyet az UIKit meghív a UIViewController View-jének memóriába töltése után. A Apple Developer Documentation szerint ez a metódus pontosan egyszer hívódik meg a vezérlő teljes élettartama alatt. viewDidLoad a fő hely a felület kezdeti beállításához, cellák regisztrálásához és adatok inicializálásához.
Főbb pontok
viewDidLoad — a UIViewController egy példánymetódusa, amelyet az UIKit azonnal meghív, miután a vezérlő View-ja betöltődött a RAM-ba. Ebben a pillanatban az összes IBOutlet tulajdonság már csatlakoztatva van a felület elemeihez, de a View még nem került hozzáadásra az ablak hierarchiához, és nem látható a felhasználó számára. A fejlesztő felülírja ezt a metódust a képernyő kezdeti beállításának elvégzéséhez.
A metódus a ViewController Lifecycle része, és közvetlenül a loadView után következik, ha a View programozottan jön létre, vagy a Storyboard-ból való betöltés után. Egy tipikus projektben a viewDidLoad a leggyakrabban felülírt UIViewController metódus, mivel biztonságos pontot biztosít a már létező és beállításra kész subviews-okkal való munkához.
Fontos részlet: a viewDidLoad meghívásakor a View méretei még nem egyeznek meg a véglegesekkel — az Auto Layout nem fejezte be a meneteket, és a frame eltérhet a várttól. A méretektől függő számításokhoz a viewDidLayoutSubviews-t használják.
A viewDidLoad meghívásának időzítése attól függ, hogyan inicializálják a vezérlőt. A legtöbb esetben az UIKit automatikusan meghívja ezt a metódust a vezérlő view tulajdonságának első elérésekor — ezt a UIViewController lazy-loading mechanizmusának nevezik.
Amikor a NavigationController vagy TabBarController először jeleníti meg a képernyőt, az UIKit ellenőrzi, hogy a View betöltődött-e. Ha nem — a loadView (vagy betöltés a Storyboard-ból) meghívódik, majd azonnal a viewDidLoad aktiválódik. Ez a szabványos forgatókönyv, és egyszer történik meg a vezérlő minden példánya esetében.
override func viewDidLoad() {
super.viewDidLoad()
print("View betöltve — a felület beállítható")
setupUI()
configureTableView()
}
A viewDidLoad nem hívódik meg újra a back button vagy dismiss révén történő visszatéréskor. Ha a logikája függ attól, hogy a képernyő újra megjelenik — helyezze el a viewWillAppear-ben. Ez az egyik leggyakoribb koncepcionális hiba: a fejlesztők azt várják, hogy a viewDidLoad minden megjelenítéskor aktiválódik, de az UIKit csak egyszer hívja meg.
Néha a fejlesztők kényszerítik a vezérlő view-jének meghívását a betöltés előrehozott elindításához: let _ = controller.view. Ez kikényszeríti a loadView és viewDidLoad meghívását, mielőtt a vezérlő megjelenne a képernyőn. Ezt a trükköt akkor használják, ha a View-t előre kell előkészíteni a zökkenőmentes átmenethez.
viewDidLoad egyszeri beállítási műveletekre szolgál, amelyek nem függnek attól, hogy a képernyő látható-e. A metódus helyes használata a tiszta architektúra és a vezérlő kiszámítható viselkedésének kulcsa.
A viewDidLoad-ban regisztrálják a nib fájlokat és osztályokat a UITableView és UICollectionView számára, beállítják a delegáltakat, megadják a UI-elemek tulajdonságainak kezdeti értékeit. Mivel az összes IBOutlet ebben a pillanatban már csatlakoztatva van, biztonságosan hivatkozhatunk a label.text, imageView.image és más subviews tulajdonságokra.
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(
CustomCell.self,
forCellReuseIdentifier: CustomCell.identifier
)
title = "Főképernyő"
}
Itt hozzák létre a viewModel-t, inicializálják a data source-t tömbökkel, feliratkoznak azokra az értesítésekre, amelyeknek a vezérlő teljes élettartama alatt működniük kell. Például a UIApplication.willEnterForegroundNotification feliratkozás az adatok háttérből való visszatéréskor történő frissítéséhez — megfelelő jelölt a viewDidLoad számára. A ViewModel a modern iOS architektúrában összekötő kapocsként szolgál a vezérlő és az üzleti logika között, és inicializálása pontosan a viewDidLoad-ban biztosítja az adatok készenlétét a képernyő első megjelenésének pillanatában.
Fordítson különös figyelmet a data source beállítására táblázatok és gyűjtemények számára. Ha a táblázata UIFetchedResultsController-t vagy NSFetchedResultsController-t használ a Core Data-val, inicializálja a fetch request-et és a delegáltat a viewDidLoad-ban. Ez garantálja, hogy a képernyő első megjelenésekor a táblázat már további lekérdezések nélkül tele lesz adatokkal.
A viewDidLoad-ban konfigurálják a NavigationBar gombjait, beállítják a large title-t, hozzáadják a search controller-t és beállítják az edit/done gombokat. Ezek az elemek ritkán változnak a képernyő ismételt megjelenítésekor, így inicializálásuk itt optimális.
Nem minden művelet alkalmas a viewDidLoad-ban. Néhány ebbe a metódusba helyezett művelet túlzott memóriafogyasztáshoz, helytelen viselkedéshez vagy hibákhoz vezet a képernyő ismételt megjelenítésekor.
Kerülje olyan hálózati kérések indítását, amelyek eredménye csak a UI-t érinti. Ha a kérés a képernyő megjelenése előtt befejeződik, a felhasználó nem látja az eredményt, ha pedig utána — az adatok elavultak lehetnek. Indítsa el a betöltést a viewDidLoad-ban, de frissítse a UI-t a viewWillAppear-ben.
Ne végezzen a viewDidLoad-ban a View méreteitől és elhelyezkedésétől függő műveleteket. A meghíváskor az Auto Layout nem fejezte be a meneteket, és a frame nem végleges lehet. Számításokhoz használja a viewDidLayoutSubviews-t vagy írja felül az updateViewConstraints-t.
Ne iratkozzon fel olyan értesítésekre, amelyek csak akkor aktívak, amikor a képernyő látható. Billentyűzet-értesítések, gyermekvezérlők tartalomváltozásáról szóló értesítések — iratkozzon fel rájuk a viewWillAppear-ben és mondja le a viewDidDisappear-ben a szükségtelen hívások és memóriaszivárgások elkerülése érdekében.
Ne hívjon olyan metódusokat, amelyek látható képernyőt igényelnek. Például a UIAlertController megjelenítésére tett kísérlet a viewDidLoad-ból hibát okoz, mivel a vezérlő View-ja még nem került hozzáadásra az ablak hierarchiához. Minden olyan UI-műveletet, amely a window-tól vagy a presentedViewController-től függ, csak a képernyő megjelenése után szabad végrehajtani.
Ne inicializáljon nehéz erőforrásokat szükségtelenül. Ha a képernyő ritkán nyílik meg vagy az adatok nem azonnal jelennek meg, halassza el az erőforrás-igényes objektumok létrehozását addig, amíg valóban szükség van rájuk. A tulajdonságok Lazy-inicializálása a Swift-ben egy beépített mechanizmus a feladat megoldására: a lazy módosítóval ellátott tulajdonság csak az első hivatkozáskor jön létre, ami memóriát takarít meg és gyorsítja a képernyő betöltését.
Ne használja a viewDidLoad-ot olyan műveletekhez, amelyeket a képernyő minden megjelenésekor végre kell hajtani. Ez a legalapvetőbb hiba: a kezdő fejlesztők gyakran helyezik az adatfrissítési logikát a viewDidLoad-ba, és csodálkoznak, hogy egy másik képernyőről visszatérve a táblázat nem töltődik újra. Ha a műveletnek minden megjelenítéskor meg kell ismétlődnie — használja a viewWillAppear-t. Ha egyszer kell végrehajtani az élettartam során — viewDidLoad. Jegyezze meg ezt az egyszerű szabályt, hogy elkerülje a UIViewController életciklusával kapcsolatos problémák többségét.
Nézzünk meg három gyakorlati példát, amelyek bemutatják a viewDidLoad helyes használatát valós projektekben. Minden példa egy konkrét képernyő-beállítási feladatot old meg.
override func viewDidLoad() {
super.viewDidLoad()
collectionView.register(
PhotoCell.self,
forCellWithReuseIdentifier: PhotoCell.reuseId
)
collectionView.register(
HeaderView.self,
forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
withReuseIdentifier: HeaderView.reuseId
)
viewModel.delegate = self
viewModel.fetchInitialPage()
}
override func viewDidLoad() {
super.viewDidLoad()
let label = UILabel()
label.text = "Helló, világ!"
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
A viewDidLoad-ban az adatok hiányában megjelenített elemeket is beállítják: üres állapot, loader, placeholder. Ezek a komponensek egyszer jönnek létre és újrahasznosításra kerülnek a képernyő minden megjelenésekor. Ezen elemek elrejtését vagy megjelenítését a viewWillAppear-ben szabályozzák az aktuális adatok függvényében.
override func viewDidLoad() {
super.viewDidLoad()
emptyStateLabel = UILabel()
emptyStateLabel.text = "Nincsenek adatok"
emptyStateLabel.textAlignment = .center
emptyStateLabel.isHidden = true
view.addSubview(emptyStateLabel)
activityIndicator = UIActivityIndicatorView(style: .medium)
activityIndicator.hidesWhenStopped = true
view.addSubview(activityIndicator)
}
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(
self,
selector: #selector(handleEnterForeground),
name: UIApplication.willEnterForegroundNotification,
object: nil
)
}
@objc private func handleEnterForeground() {
refreshContent()
}
Gyakran Ismételt Kérdések
Normál körülmények között nem — az UIKit egyszer hívja meg a viewDidLoad-ot a View memóriába töltése után. Ha a vezérlő megsemmisül és újra létrejön, a viewDidLoad az új példány esetében fog működni.
Igen, feltétlenül. A super.viewDidLoad meghívása garantálja, hogy az UIKit elvégzi a Lifecycle helyes működéséhez szükséges belső beállításokat. Mindig a super-t hívja elsőként a metódusban.
viewDidLoad egyszer hívódik meg a View betöltésekor. viewWillAppear minden alkalommal meghívódik a képernyő megjelenése előtt. Az első — egyszeri beállításra, a második — adatok és állapot frissítésére.
A nehéz szinkron műveletek a viewDidLoad-ban blokkolják a main thread-et és késleltetik a képernyő megjelenését. Az aszinkron betöltések megengedettek, de a UI frissítésekor a befejezésük után figyelembe kell venni, hogy a képernyő már rejtett lehet.
Közvetlenül nem lehet meghívni a viewDidLoad-ot — azt az UIKit hívja. A View betöltésének kényszerítéséhez nyissa meg a controller.view tulajdonságot. Ez automatikusan elindítja a loadView-t és a viewDidLoad-ot.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is