viewDidLoad पहली विधि है जिसे UIKit UIViewController के View को मेमोरी में लोड करने के बाद कॉल करता है। Apple Developer Documentation के अनुसार, यह विधि कंट्रोलर के पूरे जीवनकाल में ठीक एक बार कॉल की जाती है। viewDidLoad इंटरफ़ेस की प्रारंभिक सेटअप, सेल पंजीकरण और डेटा आरंभीकरण के लिए मुख्य स्थान है।
मुख्य बिंदु
viewDidLoad UIViewController की एक इंस्टेंस विधि है जिसे UIKit कंट्रोलर के View के मेमोरी में लोड होने के तुरंत बाद कॉल करता है। इस बिंदु तक, सभी IBOutlet गुण पहले से ही इंटरफ़ेस तत्वों से जुड़े होते हैं, लेकिन View अभी तक विंडो पदानुक्रम में नहीं जोड़ा गया है और उपयोगकर्ता को दिखाई नहीं देता है। डेवलपर प्रारंभिक स्क्रीन कॉन्फ़िगरेशन करने के लिए इस विधि को ओवरराइड करता है।
यह विधि ViewController Lifecycle का हिस्सा है और यदि View प्रोग्रामेटिक रूप से बनाया गया है तो loadView के तुरंत बाद आती है, या Storyboard से लोड करने के बाद आती है। एक सामान्य प्रोजेक्ट में, viewDidLoad UIViewController की सबसे अधिक ओवरराइड की जाने वाली विधि है, क्योंकि यह उपव्यू (subviews) के साथ काम करने के लिए एक सुरक्षित बिंदु प्रदान करती है जो पहले से मौजूद हैं और कॉन्फ़िगरेशन के लिए तैयार हैं।
एक महत्वपूर्ण विवरण: जब तक viewDidLoad कॉल किया जाता है, View के आयाम अभी तक अंतिम आयामों के अनुरूप नहीं होते — Auto Layout ने अपने पास पूरे नहीं किए हैं, और फ्रेम अपेक्षा से भिन्न हो सकता है। आयामों पर निर्भर गणनाओं के लिए, viewDidLayoutSubviews का उपयोग करें।
viewDidLoad कॉल का समय इस बात पर निर्भर करता है कि कंट्रोलर कैसे आरंभ किया गया है। अधिकांश मामलों में, UIKit इस विधि को स्वचालित रूप से कॉल करता है जब पहली बार कंट्रोलर की view संपत्ति तक पहुँचा जाता है — इसे UIViewController का lazy-loading तंत्र कहा जाता है।
जब कोई NavigationController या TabBarController पहली बार आपकी स्क्रीन प्रदर्शित करता है, UIKit जाँचता है कि View लोड है या नहीं। यदि नहीं — loadView कॉल किया जाता है (या Storyboard से लोडिंग), जिसके बाद तुरंत viewDidLoad सक्रिय हो जाता है। यह सामान्य परिदृश्य है, और यह प्रत्येक कंट्रोलर इंस्टेंस के लिए एक बार होता है।
override func viewDidLoad() {
super.viewDidLoad()
print("View लोड हुआ — आप इंटरफ़ेस कॉन्फ़िगर कर सकते हैं")
setupUI()
configureTableView()
}
बैक बटन या डिसमिस के माध्यम से स्क्रीन पर वापस लौटने पर viewDidLoad दोबारा कॉल नहीं किया जाता। यदि आपका तर्क स्क्रीन के फिर से प्रकट होने पर निर्भर करता है — तो इसे viewWillAppear में रखें। यह सबसे सामान्य अवधारणात्मक गलतियों में से एक है: डेवलपर्स उम्मीद करते हैं कि viewDidLoad हर प्रदर्शन पर चलेगा, लेकिन UIKit इसे केवल एक बार कॉल करता है।
कभी-कभी डेवलपर्स पहले से लोडिंग शुरू करने के लिए कंट्रोलर की view तक जबरदस्ती पहुँचते हैं: let _ = controller.view। यह कंट्रोलर के स्क्रीन पर प्रकट होने से पहले loadView और viewDidLoad को कॉल करने के लिए मजबूर करता है। इस तकनीक का उपयोग तब किया जाता है जब आपको एक सहज संक्रमण के लिए View को पहले से तैयार करने की आवश्यकता होती है।
viewDidLoad एक बार की सेटअप संक्रियाओं के लिए अभिप्रेत है जो इस बात पर निर्भर नहीं करतीं कि स्क्रीन दृश्यमान है या नहीं। इस विधि का सही उपयोग स्वच्छ आर्किटेक्चर और पूर्वानुमानित कंट्रोलर व्यवहार की कुंजी है।
viewDidLoad में, आप UITableView और UICollectionView के लिए nib फ़ाइलें और क्लासेज़ पंजीकृत करते हैं, डेलिगेट कॉन्फ़िगर करते हैं, और UI तत्वों के गुणों के प्रारंभिक मान सेट करते हैं। चूँकि इस बिंदु तक सभी IBOutlet पहले से जुड़े होते हैं, आप सुरक्षित रूप से label.text, imageView.image और अन्य subview गुणों तक पहुँच सकते हैं।
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(
CustomCell.self,
forCellReuseIdentifier: CustomCell.identifier
)
title = "मुख्य स्क्रीन"
}
यहाँ आप viewModel बनाते हैं, ऐरे के साथ data source आरंभ करते हैं, और उन सूचनाओं की सदस्यता लेते हैं जो कंट्रोलर के पूरे जीवनकाल में सक्रिय रहनी चाहिए। उदाहरण के लिए, बैकग्राउंड से लौटने पर डेटा अपडेट करने के लिए UIApplication.willEnterForegroundNotification की सदस्यता लेना viewDidLoad के लिए एक अच्छा उम्मीदवार है। आधुनिक iOS आर्किटेक्चर में viewModel कंट्रोलर और व्यावसायिक तर्क के बीच एक पुल के रूप में कार्य करता है, और इसे viewDidLoad में आरंभ करना सुनिश्चित करता है कि स्क्रीन के पहली बार प्रकट होने तक डेटा तैयार हो।
टेबल और कलेक्शन के लिए data source कॉन्फ़िगर करने पर विशेष ध्यान दें। यदि आपकी टेबल Core Data के साथ UIFetchedResultsController या NSFetchedResultsController का उपयोग करती है, तो fetch request और डेलिगेट को viewDidLoad में आरंभ करें। यह गारंटी देता है कि जब स्क्रीन पहली बार प्रकट होती है, तो टेबल पहले से ही बिना अतिरिक्त अनुरोधों के डेटा से भरी होगी।
viewDidLoad में, आप NavigationBar बटन कॉन्फ़िगर करते हैं, large title सेट करते हैं, search controller जोड़ते हैं, और edit/done बटन सेट करते हैं। ये तत्व स्क्रीन के दोबारा दिखाए जाने पर शायद ही कभी बदलते हैं, इसलिए इन्हें यहाँ आरंभ करना इष्टतम है।
सभी संक्रियाएँ viewDidLoad में उपयुक्त नहीं होतीं। इस विधि में रखी गई कुछ क्रियाएँ अत्यधिक मेमोरी खपत, गलत व्यवहार या स्क्रीन के दोबारा दिखाए जाने पर बग का कारण बनती हैं।
बचें उन नेटवर्क अनुरोधों को शुरू करने से जिनका परिणाम केवल UI को प्रभावित करता है। यदि अनुरोध स्क्रीन के प्रकट होने से पहले पूरा हो जाता है, तो उपयोगकर्ता परिणाम नहीं देखेगा, और यदि बाद में पूरा होता है — तो डेटा पुराना हो सकता है। viewDidLoad में लोडिंग शुरू करें, लेकिन UI को viewWillAppear में अपडेट करें।
न करें viewDidLoad में वे संक्रियाएँ जो View के आकार और स्थिति पर निर्भर करती हैं। कॉल के समय, Auto Layout ने अपने पास पूरे नहीं किए हैं, और फ्रेम अंतिम नहीं हो सकता है। गणनाओं के लिए, viewDidLayoutSubviews का उपयोग करें या updateViewConstraints को ओवरराइड करें।
सदस्यता न लें उन सूचनाओं की जो केवल तब प्रासंगिक हैं जब स्क्रीन दृश्यमान हो। कीबोर्ड सूचनाएँ, चाइल्ड कंट्रोलर से सामग्री परिवर्तन सूचनाएँ — उनकी सदस्यता viewWillAppear में लें और viewDidDisappear में सदस्यता रद्द करें ताकि अनावश्यक कॉल और लीक से बचा जा सके।
कॉल न करें ऐसी विधियाँ जिनके लिए दृश्यमान स्क्रीन की आवश्यकता होती है। उदाहरण के लिए, viewDidLoad से UIAlertController दिखाने का प्रयास करने पर त्रुटि होगी क्योंकि कंट्रोलर का View अभी तक विंडो पदानुक्रम में नहीं जोड़ा गया है। कोई भी UI संक्रियाएँ जो विंडो या presentedViewController पर निर्भर करती हैं, उन्हें स्क्रीन के प्रकट होने के बाद ही निष्पादित किया जाना चाहिए।
आरंभ न करें अनावश्यक रूप से भारी संसाधन। यदि स्क्रीन शायद ही कभी दिखाई जाती है या डेटा तुरंत प्रदर्शित नहीं होता है, तो संसाधन-गहन वस्तुओं के निर्माण को तब तक टालें जब तक उनकी वास्तव में आवश्यकता न हो। Swift में लेज़ी प्रॉपर्टी आरंभीकरण इस समस्या को हल करने के लिए एक अंतर्निर्मित तंत्र है: लेज़ी मॉडिफ़ायर वाली प्रॉपर्टी केवल पहली पहुँच पर बनाई जाएगी, जिससे मेमोरी बचती है और स्क्रीन लोडिंग तेज़ होती है।
उपयोग न करें viewDidLoad का उन संक्रियाओं के लिए जो हर बार स्क्रीन प्रकट होने पर निष्पादित होनी चाहिए। यह सबसे मौलिक गलती है: शुरुआती डेवलपर्स अक्सर डेटा अपडेट तर्क को viewDidLoad में रखते हैं और आश्चर्यचकित होते हैं कि दूसरी स्क्रीन से लौटने पर टेबल पुनः लोड नहीं होती। यदि कोई संक्रिया हर प्रदर्शन पर दोहराई जानी चाहिए — viewWillAppear का उपयोग करें। यदि इसे जीवनकाल में एक बार निष्पादित करना चाहिए — viewDidLoad का उपयोग करें। UIViewController जीवनचक्र के साथ अधिकांश समस्याओं से बचने के लिए इस सरल नियम को याद रखें।
आइए तीन व्यावहारिक उदाहरण देखें जो वास्तविक प्रोजेक्ट्स में viewDidLoad के सही उपयोग को प्रदर्शित करते हैं। प्रत्येक उदाहरण एक विशिष्ट स्क्रीन कॉन्फ़िगरेशन कार्य को हल करता है।
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 = "नमस्ते दुनिया!"
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
viewDidLoad में, आप डेटा न होने पर प्रदर्शित होने वाले तत्व भी कॉन्फ़िगर करते हैं: खाली स्थिति, लोडर, प्लेसहोल्डर। ये घटक एक बार बनाए जाते हैं और स्क्रीन के प्रकट होने पर हर बार पुनः उपयोग किए जाते हैं। इन तत्वों को छिपाना या दिखाना वर्तमान डेटा के आधार पर viewWillAppear में प्रबंधित किया जाता है।
override func viewDidLoad() {
super.viewDidLoad()
emptyStateLabel = UILabel()
emptyStateLabel.text = "कोई डेटा नहीं"
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()
}
अक्सर पूछे जाने वाले प्रश्न
सामान्य परिस्थितियों में, नहीं — UIKit View को मेमोरी में लोड करने के बाद viewDidLoad को एक बार कॉल करता है। यदि कंट्रोलर नष्ट हो जाता है और फिर से बनाया जाता है, तो viewDidLoad नए इंस्टेंस के लिए चलेगा।
हाँ, निश्चित रूप से। super.viewDidLoad कॉल करना सुनिश्चित करता है कि UIKit Lifecycle के सही ढंग से काम करने के लिए आवश्यक आंतरिक सेटअप निष्पादित करे। विधि के अंदर हमेशा super को पहले कॉल करें।
viewDidLoad View लोड होने पर एक बार कॉल किया जाता है। viewWillAppear स्क्रीन के प्रकट होने से पहले हर बार कॉल किया जाता है। पहला एक बार के सेटअप के लिए है, दूसरा डेटा और स्थिति को अपडेट करने के लिए है।
viewDidLoad में भारी सिंक्रोनस संक्रियाएँ मुख्य थ्रेड को ब्लॉक करती हैं और स्क्रीन के प्रकट होने में देरी करती हैं। एसिंक्रोनस लोडिंग स्वीकार्य है, लेकिन पूरा होने पर UI अपडेट करते समय इस संभावना को ध्यान में रखना चाहिए कि स्क्रीन पहले से छिपी हो सकती है।
आप सीधे viewDidLoad कॉल नहीं कर सकते — UIKit इसे कॉल करता है। View को लोड करने के लिए मजबूर करने के लिए, controller.view प्रॉपर्टी तक पहुँचें। यह स्वचालित रूप से loadView और viewDidLoad को ट्रिगर करेगा।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें