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()
}
واپس بٹن یا dismiss کے ذریعے اسکرین پر واپسی پر viewDidLoad دوبارہ کال نہیں کیا جاتا۔ اگر آپ کی منطق اسکرین کے دوبارہ ظاہر ہونے پر منحصر ہے — تو اسے viewWillAppear میں رکھیں۔ یہ سب سے عام تصوراتی غلطیوں میں سے ایک ہے: ڈویلپر توقع کرتے ہیں کہ viewDidLoad ہر نمائش پر چلے گا، لیکن UIKit اسے صرف ایک بار کال کرتا ہے۔
بعض اوقات ڈویلپر پہلے سے لوڈنگ شروع کرنے کے لیے کنٹرولر کی view تک زبردستی رسائی حاصل کرتے ہیں: let _ = controller.view۔ یہ کنٹرولر کے اسکرین پر ظاہر ہونے سے پہلے loadView اور viewDidLoad کال کرنے پر مجبور کرتا ہے۔ یہ تکنیک اس وقت استعمال ہوتی ہے جب آپ کو ہموار منتقلی کے لیے View پہلے سے تیار کرنے کی ضرورت ہو۔
viewDidLoad ایک بار کی ترتیبی کارروائیوں کے لیے ہے جو اسکرین کے دکھائی دینے پر منحصر نہیں ہوتیں۔ اس طریقہ کا صحیح استعمال صاف ستھرے فن تعمیر اور پیش قیاسی کنٹرولر رویے کی کنجی ہے۔
viewDidLoad میں، آپ UITableView اور UICollectionView کے لیے nib فائلیں اور کلاسز رجسٹر کرتے ہیں، ڈیلیگیٹ ترتیب دیتے ہیں اور UI عناصر کی خواص کی ابتدائی قیمتیں مقرر کرتے ہیں۔ چونکہ اس مقام پر تمام IBOutlet پہلے سے جڑے ہوتے ہیں، آپ محفوظ طریقے سے label.text، imageView.image اور دیگر ذیلی نظارہ خواص تک رسائی حاصل کر سکتے ہیں۔
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(
CustomCell.self,
forCellReuseIdentifier: CustomCell.identifier
)
title = "مرکزی اسکرین"
}
یہاں آپ viewModel بناتے ہیں، arrays کے ساتھ 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 میں سست خصوصیت کی ابتدا (lazy initialization) اس مسئلے کو حل کرنے کے لیے ایک بلٹ ان میکانزم ہے: lazy modifier والی خصوصیت صرف پہلی رسائی پر بنائی جائے گی، میموری بچائے گی اور اسکرین لوڈنگ کو تیز کرے گی۔
استعمال نہ کریں 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں