UIViewController iOS ایپلیکیشنز کی مرکزی کلاس ہے، جو اسکرین اور اس کے مواد کا انتظام کرتی ہے۔ ہر iPhone یا iPad اسکرین ایک ViewController کے زیر انتظام ہوتی ہے، جو ڈسپلے، لائف سائیکل اور نیویگیشن کو مربوط کرتا ہے۔ UIKit آرکیٹیکچر کے بارے میں مزید جاننے کے لیے Apple کی سرکاری دستاویزات دیکھیں۔
اہم نکات
UIViewController UIKit فریم ورک کی ایک کلاس ہے جو UIView کے درجہ بندی کا انتظام کرتی ہے اور اسکرین پر ڈیٹا ڈسپلے کو مربوط کرتی ہے۔ ہر iOS ایپلیکیشن میں کم از کم ایک ViewController ہوتا ہے — ونڈو کا روٹ کنٹرولر۔ کنٹرولر اسکرین گھومنے، اسکرینوں کے درمیان منتقلی اور لائف سائیکل کے واقعات کو ہینڈل کرتا ہے۔
iOS میں MVC (Model-View-Controller) آرکیٹیکچر بالکل UIViewController کے ذریعے لاگو کیا گیا ہے: کنٹرولر ماڈل سے ڈیٹا وصول کرتا ہے اور ویو کو اپ ڈیٹ کرتا ہے۔ ViewController ایک بصری عنصر نہیں ہے — یہ view پراپرٹی کا انتظام کرتا ہے، جس میں subview کا درجہ بندی ہوتا ہے۔ Apple (2026) کے مطابق، UIKit میں UIViewController کے 40 سے زیادہ بلٹ ان ذیلی کلاسز ہیں۔
پہلے 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 عناصر پروگرامی طور پر بنائے جاتے ہیں، کنسٹرینٹس ترتیب دیے جاتے ہیں اور ابتدائی ڈیٹا لوڈ کیا جاتا ہے۔
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 صرف ViewModel کو Combine یا ڈیلیگیٹ کے ذریعے 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں