viewDidLoad হল প্রথম মেথড যা UIKit UIViewController-এর View মেমোরিতে লোড করার পরে কল করে। Apple Developer Documentation-এর তথ্য অনুসারে, এই মেথডটি কন্ট্রোলারের পুরো জীবনকালে ঠিক একবার কল করা হয়। viewDidLoad হল ইন্টারফেসের প্রারম্ভিক সেটআপ, সেল রেজিস্ট্রেশন এবং ডেটা আরম্ভের জন্য প্রধান স্থান।
মূল বিষয়
viewDidLoad হল UIViewController-এর একটি ইনস্ট্যান্স মেথড যা UIKit কন্ট্রোলারের View মেমোরিতে লোড হওয়ার সাথে সাথেই কল করে। এই মুহুর্তে, সমস্ত IBOutlet প্রপার্টি ইতিমধ্যেই ইন্টারফেস উপাদানের সাথে সংযুক্ত, কিন্তু View এখনও উইন্ডো হায়ারার্কিতে যোগ করা হয়নি এবং ব্যবহারকারীর কাছে দৃশ্যমান নয়। ডেভেলপার প্রারম্ভিক স্ক্রিন কনফিগারেশন সম্পাদনের জন্য এই মেথডটি ওভাররাইড করে।
মেথডটি ViewController Lifecycle-এর অংশ এবং View যদি প্রোগ্রামেটিকভাবে তৈরি করা হয় তবে loadView-এর পরপরই আসে, অথবা Storyboard থেকে লোড করার পরে আসে। একটি সাধারণ প্রকল্পে, viewDidLoad হল UIViewController-এর সবচেয়ে বেশি ওভাররাইড করা মেথড, কারণ এটি ইতিমধ্যে বিদ্যমান এবং কনফিগারেশনের জন্য প্রস্তুত সাবভিউগুলির সাথে কাজ করার জন্য একটি নিরাপদ পয়েন্ট প্রদান করে।
একটি গুরুত্বপূর্ণ বিবরণ: 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-এ লোডিং শুরু করুন, কিন্তু viewWillAppear-এ UI আপডেট করুন।
করবেন না 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন