UIViewController হল iOS অ্যাপ্লিকেশনের কেন্দ্রীয় ক্লাস, যা স্ক্রিন এবং এর বিষয়বস্তু পরিচালনা করে। প্রতিটি iPhone বা iPad স্ক্রিন একটি ViewController দ্বারা পরিচালিত হয়, যা প্রদর্শন, জীবনচক্র এবং নেভিগেশন সমন্বয় করে। UIKit আর্কিটেকচার সম্পর্কে আরও পড়ুন Apple এর অফিসিয়াল ডকুমেন্টেশনে।
মূল পয়েন্ট
UIViewController হল UIKit ফ্রেমওয়ার্কের একটি ক্লাস যা UIView এর শ্রেণিবিন্যাস পরিচালনা করে এবং স্ক্রিনে ডেটা প্রদর্শন সমন্বয় করে। প্রতিটি iOS অ্যাপ্লিকেশনে কমপক্ষে একটি ViewController থাকে — উইন্ডোর মূল কন্ট্রোলার। কন্ট্রোলার স্ক্রিন ঘূর্ণন, স্ক্রিনের মধ্যে স্থানান্তর এবং জীবনচক্র ইভেন্টগুলি পরিচালনা করে।
iOS এ MVC (Model-View-Controller) আর্কিটেকচার UIViewController এর মাধ্যমেই বাস্তবায়িত হয়: কন্ট্রোলার মডেল থেকে ডেটা গ্রহণ করে এবং ভিউ আপডেট করে। ViewController একটি ভিজুয়াল উপাদান নয় — এটি view প্রপার্টি পরিচালনা করে যাতে subview এর শ্রেণিবিন্যাস থাকে। Apple (2026) অনুসারে, UIKit এ 40 টিরও বেশি অন্তর্নির্মিত UIViewController সাবক্লাস রয়েছে।
প্রথম iPhone SDK (2008) তিনটি জীবনচক্র মেথড সহ UIViewController অন্তর্ভুক্ত করেছিল। 18 বছরে, Apple Container View Controller, অভিযোজিত উপস্থাপনা, কাস্টম অ্যানিমেশনের জন্য UIViewControllerTransitioningDelegate এবং iPad এ বিভক্ত স্ক্রিন মোডের জন্য সমর্থন যোগ করেছে। UIViewController UIKit অ্যাপ্লিকেশনের জন্য একটি বাধ্যতামূলক উপাদান হিসেবে রয়ে গেছে।
UIViewController এর জীবনচক্র — স্ক্রিন তৈরি, প্রদর্শন এবং লুকানোর সময় সিস্টেম দ্বারা কল করা মেথডগুলির একটি ক্রম। Lifecycle বোঝা অত্যন্ত গুরুত্বপূর্ণ: ভুল স্থানে কোড স্থাপন মেমরি লিক, অপ্রয়োজনীয় নেটওয়ার্ক অনুরোধ এবং ইন্টারফেস ঝলকানির কারণ হয়।
| মেথড | কলের মুহূর্ত | উদ্দেশ্য |
|---|---|---|
| viewDidLoad | একবার, view মেমরিতে লোড হওয়ার পর | প্রাথমিক UI সেটআপ, Combine সাবস্ক্রিপশন |
| viewWillAppear | স্ক্রিন প্রদর্শিত হওয়ার আগে | ডেটা আপডেট, নেভিগেশন বার লুকানো/দেখানো |
| viewDidAppear | স্ক্রিন প্রদর্শিত হওয়ার পর | অ্যানিমেশন শুরু, বিশ্লেষণ, ক্যামেরা আপডেট |
| viewWillDisappear | স্ক্রিন থেকে যাওয়ার আগে | খসড়া সংরক্ষণ, বিজ্ঞপ্তি থেকে আনসাবস্ক্রাইব |
| viewDidDisappear | স্ক্রিন থেকে যাওয়ার পর | ভারী প্রক্রিয়া বন্ধ, সম্পদ মুক্ত করা |
স্ক্রিনের প্রথম প্রদর্শনে ক্রম: init → loadView → viewDidLoad → viewWillAppear → viewDidAppear। পুনরায় প্রদর্শনে (অন্য স্ক্রিন থেকে ফিরে আসা): viewWillAppear → viewDidAppear। viewDidLoad কন্ট্রোলারের জীবনকালে শুধুমাত্র একবার কল হয়।
viewDidLoad মেথড হল ইউজার ইন্টারফেস কনফিগার করার প্রধান বিন্দু। এটি view মেমরিতে লোড হওয়ার পরে কল হয়, যখন সমস্ত IBOutlet সংযোগ ইতিমধ্যে প্রতিষ্ঠিত হয়েছে। এখানে UI উপাদানগুলো প্রোগ্রামেটিকভাবে তৈরি করা হয়, constraints কনফিগার করা হয় এবং প্রাথমিক ডেটা লোড করা হয়।
final class ProfileViewController: UIViewController {
private let tableView = UITableView()
private let viewModel = ProfileViewModel()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
bindViewModel()
}
private func setupUI() {
view.addSubview(tableView)
tableView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
tableView.register(ProfileCell.self,
forCellReuseIdentifier: ProfileCell.reuseId)
}
private func bindViewModel() {
viewModel.$user
.receive(on: DispatchQueue.main)
.sink { [weak self] user in
self?.title = user.name
}
.store(in: &cancellables)
}
}SwiftUI তে, এই কোড View এর body এর সমতুল্য। কিন্তু UIViewController জীবনচক্র এবং অপ্টিমাইজেশনের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়। bindViewModel প্রতিক্রিয়াশীল সাবস্ক্রিপশনের জন্য Combine ব্যবহার করে — মডেল পরিবর্তন হলে ডেটা স্বয়ংক্রিয়ভাবে আপডেট হয়।
viewWillAppear স্ক্রিন প্রদর্শিত হওয়ার আগে প্রতিবার কল হয়, এমনকি এটি ইতিমধ্যে মেমরিতে থাকলেও। এটি সেই ডেটা আপডেট করার জায়গা যা অন্য স্ক্রিনে পরিবর্তিত হতে পারে: তালিকা পুনরায় লোড করা, নোটিফিকেশন ব্যাজ আপডেট করা, নির্দিষ্ট স্ক্রিনের জন্য নেভিগেশন বার কনফিগার করা।
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// এই স্ক্রিনে নেভিগেশন বার লুকান
navigationController?.setNavigationBarHidden(true, animated: animated)
// অন্য স্ক্রিন থেকে ফিরে আসার সময় ডেটা আপডেট করুন
tableView.reloadData()
badgeLabel.text = "\(CartManager.shared.itemCount)"
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// বিশ্লেষণ: ব্যবহারকারী স্ক্রিন দেখার পরেই
AnalyticsService.shared.logScreenView("Profile")
}viewDidLoad এবং viewWillAppear এর মধ্যে পার্থক্য গুরুত্বপূর্ণ: viewDidLoad একবার নির্বাহিত হয় এবং স্থির সেটআপের জন্য উপযুক্ত, viewWillAppear প্রতিবার স্ক্রিন প্রদর্শিত হলে নির্বাহিত হয় এবং গতিশীল আপডেটের জন্য উপযুক্ত। viewDidLoad এ নেটওয়ার্ক অনুরোধ রাখলে স্ক্রিনে ফিরে আসার সময় পুরানো ডেটা দেখাবে।
Container View Controller হল একটি ViewController যা এক বা একাধিক চাইল্ড ViewController পরিচালনা করে। Apple তিনটি অন্তর্নির্মিত কন্টেইনার প্রদান করে: UINavigationController (স্ক্রিন স্ট্যাক), UITabBarController (ট্যাব), এবং UISplitViewController (iPad এর জন্য মাস্টার-ডিটেল)।
UINavigationController স্ট্যাকে স্থানান্তর সংগঠিত করে — push স্ক্রিন যোগ করে, pop সরিয়ে দেয়। UITabBarController অ্যাপ্লিকেশনের স্বাধীন বিভাগগুলির মধ্যে সুইচ করে। UISplitViewController iPad এ দুটি কন্ট্রোলার পাশাপাশি এবং iPhone এ একটি দেখায়। ডেভেলপার addChild এর মাধ্যমে কাস্টম কন্টেইনার তৈরি করতে পারে।
// কাস্টম Container View Controller
final class ContainerViewController: UIViewController {
private let sidebarVC = SidebarViewController()
private let contentVC = ContentViewController()
override func viewDidLoad() {
super.viewDidLoad()
// চাইল্ড কন্ট্রোলার যোগ করা
addChild(sidebarVC)
view.addSubview(sidebarVC.view)
sidebarVC.didMove(toParent: self)
addChild(contentVC)
view.addSubview(contentVC.view)
contentVC.didMove(toParent: self)
}
}Container View Controller এর সাথে সঠিক কাজের জন্য এই ক্রমে addChild, view যোগ করা এবং didMove(toParent:) কল করা প্রয়োজন। অপসারণের সময়: willMove(toParent: nil), removeFromSuperview, removeFromParent। ক্রম লঙ্ঘন মেমরি লিকের কারণ হয়।
Massive View Controller সমস্যা ঘটে যখন UIViewController তে ব্যবসায়িক যুক্তি, নেটওয়ার্ক অনুরোধ, নেভিগেশন এবং UI কোডের শত শত লাইন থাকে। Apple সমস্যাটি স্বীকার করে এবং নেভিগেশন বের করার জন্য Coordinator এর সাথে MVVM (Model-View-ViewModel) সুপারিশ করে।
MVVM ব্যবসায়িক যুক্তি কন্ট্রোলার থেকে ViewModel এ স্থানান্তর করে। Controller শুধুমাত্র Combine বা ডেলিগেটের মাধ্যমে ViewModel কে View এর সাথে সংযুক্ত করে। Coordinator নেভিগেশন যুক্তি — কন্ট্রোলারগুলির মধ্যে তৈরি এবং স্থানান্তর — একটি পৃথক ক্লাসে বের করে। এই পদ্ধতি 2024 সাল থেকে Apple এর সেরা অনুশীলনে অন্তর্ভুক্ত হয়েছে।
// Coordinator — নেভিগেশন ব্যবস্থাপনা
protocol Coordinator {
var childCoordinators: [Coordinator] { get set }
func start()
}
final class MainCoordinator: Coordinator {
var childCoordinators = [Coordinator]()
private let navigationController: UINavigationController
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func start() {
let vc = ListViewController()
vc.didSelectItem = { [weak self] item in
self?.showDetail(item)
}
navigationController.pushViewController(vc, animated: false)
}
private func showDetail(_ item: Item) {
let vc = DetailViewController(item: item)
navigationController.pushViewController(vc, animated: true)
}
}UIViewController এবং SwiftUI View এর মধ্যে পছন্দ প্রকল্পের শুরুর বছর, কাস্টমাইজেশন প্রয়োজনীয়তা এবং ন্যূনতম সমর্থিত iOS সংস্করণের উপর নির্ভর করে। UIKit UIViewController সহ 2020 এর আগে শুরু হওয়া প্রকল্প এবং গভীর ইন্টারফেস কাস্টমাইজেশন সহ অ্যাপ্লিকেশনের জন্য ভিত্তি হিসেবে রয়ে গেছে।
SwiftUI iOS 17+ সহ নতুন প্রকল্প, মানক ইন্টারফেস এবং প্রোটোটাইপের জন্য উপযুক্ত। তবে কাস্টম ট্রানজিশন, ক্যামেরা কাজ, MapKit, জটিল CALayer অ্যানিমেশনের জন্য UIViewController প্রয়োজন। Apple UIHostingController (UIKit এর ভিতরে SwiftUI) এবং UIViewRepresentable (SwiftUI এর ভিতরে UIKit) এর মাধ্যমে পদ্ধতি সংযুক্ত করার সুপারিশ করে।
| পরিস্থিতি | UIKit (UIViewController) | SwiftUI (View) |
|---|---|---|
| কাস্টম অ্যানিমেশন | UIViewPropertyAnimator এর মাধ্যমে সম্পূর্ণ নিয়ন্ত্রণ | Animation এর মাধ্যমে সীমিত |
| ক্যামেরা কাজ | AVCaptureSession + UIViewPreview | UIViewControllerRepresentable এর মাধ্যমে |
| CollectionView | UICollectionView + UICollectionViewLayout | LazyVGrid/LazyHGrid |
| iPad অভিযোজন | UISplitViewController + UITraitCollection | NavigationSplitView + sizeClass |
| উন্নয়নের গতি | ধীর (ম্যানুয়াল লেআউট) | দ্রুত (ঘোষণামূলক) |
সচরাচর জিজ্ঞাসা
UIViewController হল একটি কন্ট্রোলার যা স্ক্রিন এবং তার জীবনচক্র পরিচালনা করে। UIView হল একটি ভিউ যা বিষয়বস্তু প্রদর্শন করে। ViewController এ UIViews এর শ্রেণিবিন্যাস থাকে কিন্তু এটি নিজে একটি ভিজুয়াল উপাদান নয়। একটি কন্ট্রোলার একাধিক ভিউ পরিচালনা করে।
Massive View Controller হল একটি অ্যান্টি-প্যাটার্ন যেখানে UIViewController তে অত্যধিক যুক্তি থাকে: ডেটা, নেভিগেশন, নেটওয়ার্ক অনুরোধ, অ্যানিমেশন। সমাধান — আলাদা সার্ভিস, কোঅর্ডিনেটর এবং ViewModel (MVVM) এ কোড বের করা।
চারটি উপায়: prepare(for:sender:) (Segue) এ প্রপার্টির মাধ্যমে, ডেলিগেট (Delegate) এর মাধ্যমে, ক্লোজার (Closure) এর মাধ্যমে, শেয়ার্ড সার্ভিসের মাধ্যমে। শিথিল সংযোগের জন্য, Coordinator + Delegate বা Combine ব্যবহার করুন।
Container View Controller হল একটি কন্ট্রোলার যা চাইল্ড ViewController পরিচালনা করে। উদাহরণ: UINavigationController, UITabBarController, UISplitViewController। প্যারেন্ট কন্ট্রোলার addChild এর মাধ্যমে চাইল্ড যোগ করে, তাদের মধ্যে সুইচ করে এবং তাদের লেআউট পরিচালনা করে।
UIViewController — জটিল কাস্টম অ্যানিমেশন, ক্যামেরা কাজ, মানচিত্র, ভিডিও, কাস্টম লেআউট সহ UICollectionView এর জন্য। SwiftUI View — iOS 13+ এ মানক ইন্টারফেসের জন্য। UIHostingController এর মাধ্যমে সংযুক্ত করা গ্রহণযোগ্য।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন