viewDidLoad — ay ang unang paraan na tinatawag ng UIKit pagkatapos na ma-load ang View ng UIViewController sa memorya. Ayon sa Apple Developer Documentation, ang paraang ito ay tinatawag nang eksaktong isang beses sa buong panahon ng pag-iral ng controller. viewDidLoad ang pangunahing lugar para sa paunang pagsasaayos ng interface, pagrehistro ng mga cell at pagsisimula ng data.
Mga Pangunahing Punto
viewDidLoad — ay isang paraan ng instance ng UIViewController na tinatawag ng UIKit kaagad pagkatapos ma-load ang View ng controller sa RAM. Sa sandaling ito, lahat ng mga property ng IBOutlet ay konektado na sa mga elemento ng interface, ngunit ang View ay hindi pa naidaragdag sa hierarchy ng window at hindi nakikita ng gumagamit. Ang developer ay nag-o-override ng paraang ito upang gawin ang paunang pagsasaayos ng screen.
Ang paraan ay bahagi ng ViewController Lifecycle at sumusunod kaagad pagkatapos ng loadView, kung ang View ay ginawa nang programmatically, o pagkatapos mag-load mula sa Storyboard. Sa isang tipikal na proyekto, ang viewDidLoad ay ang pinakamadalas na i-override na paraan ng UIViewController, dahil nagbibigay ito ng ligtas na punto para sa pagtatrabaho sa mga subviews na umiiral na at handa na para sa pagsasaayos.
Isang mahalagang detalye: sa oras ng pagtawag ng viewDidLoad, ang mga sukat ng View ay hindi pa tumutugma sa mga pangwakas — hindi pa natatapos ng Auto Layout ang mga pass, at ang frame ay maaaring mag-iba mula sa inaasahan. Para sa mga kalkulasyon na nakadepende sa mga sukat, gamitin ang viewDidLayoutSubviews.
Ang oras ng pagtawag ng viewDidLoad ay nakadepende sa kung paano na-initialize ang controller. Sa karamihan ng mga kaso, awtomatikong tinatawag ng UIKit ang paraang ito sa unang pag-access sa property na view ng controller — ito ay tinatawag na mekanismong lazy-loading ng UIViewController.
Kapag ang NavigationController o TabBarController ay unang nagpakita ng iyong screen, sinusuri ng UIKit kung ang View ay na-load. Kung hindi — ang loadView (o pag-load mula sa Storyboard) ay tinatawag, pagkatapos nito ay agad na na-activate ang viewDidLoad. Ito ang karaniwang sitwasyon at nangyayari nang isang beses para sa bawat instance ng controller.
override func viewDidLoad() {
super.viewDidLoad()
print("View ay na-load — maaaring i-configure ang interface")
setupUI()
configureTableView()
}
Ang viewDidLoad ay hindi na tinatawag muli kapag bumalik sa screen sa pamamagitan ng back button o dismiss. Kung ang iyong lohika ay nakadepende sa muling paglitaw ng screen — ilagay ito sa viewWillAppear. Ito ay isa sa mga pinakakaraniwang konseptuwal na pagkakamali: inaasahan ng mga developer na ang viewDidLoad ay gagana sa bawat pagpapakita, ngunit tinatawag lamang ito ng UIKit nang isang beses.
Minsan pinipilit ng mga developer ang view ng controller upang simulan ang pag-load nang maaga: let _ = controller.view. Pinipilit nito ang pagtawag ng loadView at viewDidLoad bago lumitaw ang controller sa screen. Ang trick na ito ay ginagamit kapag kailangan ihanda ang View nang maaga para sa isang maayos na transisyon.
viewDidLoad ay dinisenyo para sa isang beses na mga operasyon ng pagsasaayos na hindi nakadepende sa kung ang screen ay nakikita. Ang tamang paggamit ng paraang ito ay susi sa malinis na arkitektura at mahuhulaan na pag-uugali ng controller.
Sa viewDidLoad, nirerehistro ang mga nib file at klase para sa UITableView at UICollectionView, isinaayos ang mga delegado, at itinatakda ang mga paunang halaga ng mga property ng UI element. Dahil lahat ng IBOutlet ay konektado na sa sandaling ito, maaaring ligtas na ma-access ang label.text, imageView.image at iba pang property ng subviews.
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(
CustomCell.self,
forCellReuseIdentifier: CustomCell.identifier
)
title = "Pangunahing screen"
}
Dito ginagawa ang viewModel, ini-initialize ang data source gamit ang mga array, at nagse-subscribe sa mga notification na dapat gumana sa buong buhay ng controller. Halimbawa, ang pag-subscribe sa UIApplication.willEnterForegroundNotification para sa pag-update ng data kapag bumalik mula sa background — angkop na kandidato para sa viewDidLoad. Ang ViewModel sa modernong arkitektura ng iOS ay nagsisilbing tulay sa pagitan ng controller at ng lohika ng negosyo, at ang inisyalisasyon nito mismo sa viewDidLoad ay nagsisiguro ng kahandaan ng data sa sandaling unang lumitaw ang screen.
Magbigay ng espesyal na atensyon sa pagsasaayos ng data source para sa mga talahanayan at koleksyon. Kung ang iyong talahanayan ay gumagamit ng UIFetchedResultsController o NSFetchedResultsController na may Core Data, i-initialize ang fetch request at delegado sa viewDidLoad. Ginagarantiyahan nito na sa unang paglitaw ng screen, ang talahanayan ay mapupuno na ng data nang walang karagdagang query.
Sa viewDidLoad, isinaayos ang mga pindutan ng NavigationBar, itinatakda ang large title, idinaragdag ang search controller at itinatakda ang edit/done na mga pindutan. Ang mga elementong ito ay bihirang magbago sa paulit-ulit na pagpapakita ng screen, kaya ang inisyalisasyon nila dito ay optimal.
Hindi lahat ng operasyon ay angkop sa viewDidLoad. Ang ilang mga aksyon na inilalagay sa paraang ito ay humahantong sa labis na paggamit ng memorya, maling pag-uugali o mga bug sa paulit-ulit na pagpapakita ng screen.
Iwasan ang pagsisimula ng mga network request na ang resulta ay nakakaapekto lamang sa UI. Kung ang request ay matapos bago lumitaw ang screen, hindi makikita ng gumagamit ang resulta, at kung pagkatapos — ang data ay maaaring luma na. Simulan ang pag-load sa viewDidLoad, ngunit i-update ang UI sa viewWillAppear.
Huwag gawin sa viewDidLoad ang mga operasyon na nakadepende sa mga sukat at posisyon ng View. Sa oras ng pagtawag, hindi pa natatapos ng Auto Layout ang mga pass, at ang frame ay maaaring hindi pinal. Para sa mga kalkulasyon, gamitin ang viewDidLayoutSubviews o i-override ang updateViewConstraints.
Huwag mag-subscribe sa mga notification na aktibo lamang kapag ang screen ay nakikita. Mga notification ng keyboard, mga notification tungkol sa pagbabago ng nilalaman ng child controller — mag-subscribe sa kanila sa viewWillAppear at mag-unsubscribe sa viewDidDisappear upang maiwasan ang mga hindi kinakailangang tawag at pagtagas ng memorya.
Huwag tawagin ang mga paraan na nangangailangan ng nakikitang screen. Halimbawa, ang pagtatangkang magpakita ng UIAlertController mula sa viewDidLoad ay magdudulot ng error dahil ang View ng controller ay hindi pa naidaragdag sa hierarchy ng window. Lahat ng UI operasyon na nakadepende sa window o presentedViewController ay dapat isagawa lamang pagkatapos lumitaw ang screen.
Huwag i-initialize ang mabibigat na mapagkukunan nang hindi kinakailangan. Kung ang screen ay bihirang buksan o ang data ay hindi agad naipapakita, ipagpaliban ang paggawa ng mga resource-intensive na bagay hanggang sa talagang kailangan ang mga ito. Ang Lazy-inisyalisasyon ng mga property sa Swift ay isang built-in na mekanismo para sa paglutas ng gawaing ito: ang property na may modifier na lazy ay malilikha lamang sa unang pag-access, na nakakatipid ng memorya at nagpapabilis ng pag-load ng screen.
Huwag gamitin ang viewDidLoad para sa mga operasyon na dapat isagawa sa bawat paglitaw ng screen. Ito ang pinakapangunahing pagkakamali: ang mga baguhang developer ay madalas na naglalagay ng lohika ng pag-update ng data sa viewDidLoad at nagtataka kung bakit ang talahanayan ay hindi na-reload kapag bumalik mula sa ibang screen. Kung ang operasyon ay dapat ulitin sa bawat pagpapakita — gamitin ang viewWillAppear. Kung dapat itong isagawa nang isang beses sa buhay — viewDidLoad. Tandaan ang simpleng patakarang ito upang maiwasan ang karamihan sa mga problema sa lifecycle ng UIViewController.
Tingnan natin ang tatlong praktikal na halimbawa na nagpapakita ng tamang paggamit ng viewDidLoad sa tunay na mga proyekto. Bawat halimbawa ay lumulutas ng isang tiyak na gawain ng pagsasaayos ng screen.
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 = "Kumusta, mundo!"
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
Sa viewDidLoad din isinaayos ang mga elementong ipinapakita kapag walang data: walang laman na estado, loader, placeholder. Ang mga component na ito ay ginagawa nang isang beses at ginagamit muli sa bawat paglitaw ng screen. Ang pagtatago o pagpapakita ng mga elementong ito ay kinokontrol sa viewWillAppear depende sa kasalukuyang data.
override func viewDidLoad() {
super.viewDidLoad()
emptyStateLabel = UILabel()
emptyStateLabel.text = "Walang data"
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()
}
Mga Madalas Itanong
Sa normal na mga kondisyon hindi — tinatawag ng UIKit ang viewDidLoad nang isang beses pagkatapos i-load ang View sa memorya. Kung ang controller ay sirain at muling likhain, ang viewDidLoad ay gagana para sa bagong instance.
Oo, kinakailangan. Ang pagtawag ng super.viewDidLoad ay ginagarantiyahan na gagawin ng UIKit ang panloob na pagsasaayos na kinakailangan para sa tamang paggana ng Lifecycle. Palaging tawagin ang super bilang unang bagay sa loob ng paraan.
viewDidLoad ay tinatawag nang isang beses kapag nag-load ang View. viewWillAppear ay tinatawag bawat oras bago lumitaw ang screen. Ang una — para sa isang beses na pagsasaayos, ang pangalawa — para sa pag-update ng data at estado.
Ang mabibigat na synchronous na operasyon sa viewDidLoad ay humaharang sa main thread at naantala ang paglitaw ng screen. Ang asynchronous na pag-load ay pinapayagan, ngunit kapag ina-update ang UI pagkatapos makumpleto, dapat isaalang-alang na ang screen ay maaaring nakatago na.
Hindi direktang matawag ang viewDidLoad — ito ay tinatawag ng UIKit. Upang pilitin ang pag-load ng View, i-access ang property na controller.view. Ito ay awtomatikong magti-trigger ng loadView at viewDidLoad.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din