ViewController — iOS میں اسکرین کنٹرولر کا جوہر اور اس کا Lifecycle

مصنف: IT Sectr اشاعت: 2026-02-22 مطالعے کا وقت: 7 منٹ

UIViewController iOS ایپلیکیشنز کی مرکزی کلاس ہے، جو اسکرین اور اس کے مواد کا انتظام کرتی ہے۔ ہر iPhone یا iPad اسکرین ایک ViewController کے زیر انتظام ہوتی ہے، جو ڈسپلے، لائف سائیکل اور نیویگیشن کو مربوط کرتا ہے۔ UIKit آرکیٹیکچر کے بارے میں مزید جاننے کے لیے Apple کی سرکاری دستاویزات دیکھیں۔

اہم نکات

  • UIViewController — UIKit میں اپنے لائف سائیکل کے ساتھ اسکرین کے انتظام کے لیے بنیادی کلاس
  • viewDidLoad — ایک بار کال ہوتا ہے، UI ابتداء اور ڈیٹا سبسکرپشن کا نقطہ
  • viewWillAppear — اسکرین جلد نظر آئے گی، ڈسپلے سے پہلے ڈیٹا اپ ڈیٹ
  • Lifecycle میں پانچ طریقے شامل ہیں: viewDidLoad، viewWillAppear، viewDidAppear، viewWillDisappear، viewDidDisappear
  • Massive View Controller — iOS کا مرکزی اینٹی پیٹرن، MVVM یا Coordinator کے ذریعے حل کیا جاتا ہے

ViewController کیا ہے؟

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 کا لائف سائیکل

UIViewController کا لائف سائیکل — اسکرین بنانے، ڈسپلے کرنے اور چھپانے پر سسٹم کے ذریعے کال کیے جانے والے طریقوں کا ایک سلسلہ ہے۔ Lifecycle کو سمجھنا انتہائی اہم ہے: کوڈ کی غلط جگہ میموری لیک، غیر ضروری نیٹ ورک درخواستوں اور انٹرفیس جھلملاہٹ کا سبب بنتی ہے۔

طریقہکال کا لمحہمقصد
viewDidLoadایک بار، view کے میموری میں لوڈ ہونے کے بعدابتدائی UI سیٹ اپ، Combine سبسکرپشن
viewWillAppearاسکرین ظاہر ہونے سے پہلےڈیٹا اپ ڈیٹ، نیویگیشن بار چھپانا/دکھانا
viewDidAppearاسکرین ظاہر ہونے کے بعداینیمیشن شروع کرنا، تجزیہ، کیمرہ اپ ڈیٹ
viewWillDisappearاسکرین چھوڑنے سے پہلےمسودے محفوظ کرنا، نوٹیفیکیشنز سے ان سبسکرائب
viewDidDisappearاسکرین چھوڑنے کے بعدبھاری عمل روکنا، وسائل آزاد کرنا

اسکرین ظاہر ہونے پر کال کا ترتیب

اسکرین کی پہلی ڈسپلے پر ترتیب: init → loadView → viewDidLoad → viewWillAppear → viewDidAppear۔ دوبارہ ظاہر ہونے پر (دوسری اسکرین سے واپسی): viewWillAppear → viewDidAppear۔ viewDidLoad کنٹرولر کی زندگی میں صرف ایک بار کال ہوتا ہے۔

viewDidLoad، init اور UI سیٹ اپ

viewDidLoad طریقہ یوزر انٹرفیس کو ترتیب دینے کا مرکزی نقطہ ہے۔ یہ view کے میموری میں لوڈ ہونے کے بعد کال ہوتا ہے، جب تمام IBOutlet کنکشنز پہلے سے قائم ہو چکے ہوتے ہیں۔ یہاں UI عناصر پروگرامی طور پر بنائے جاتے ہیں، کنسٹرینٹس ترتیب دیے جاتے ہیں اور ابتدائی ڈیٹا لوڈ کیا جاتا ہے۔

swift
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 اور ڈیٹا اپ ڈیٹ

viewWillAppear اسکرین ظاہر ہونے سے پہلے ہر بار کال ہوتا ہے، چاہے یہ پہلے سے میموری میں ہو۔ یہ وہ جگہ ہے جہاں ڈیٹا کو اپ ڈیٹ کیا جاتا ہے جو کسی دوسری اسکرین پر تبدیل ہو سکتا ہے: فہرست دوبارہ لوڈ کرنا، نوٹیفکیشن بیج اپ ڈیٹ کرنا، مخصوص اسکرین کے لیے نیویگیشن بار ترتیب دینا۔

swift
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: UINavigationController اور UITabBarController

Container View Controller ایک ViewController ہے جو ایک یا زیادہ چائلڈ ViewController کا انتظام کرتا ہے۔ Apple تین بلٹ ان کنٹینر فراہم کرتا ہے: UINavigationController (اسکرین اسٹیک)، UITabBarController (ٹیبز)، اور UISplitViewController (iPad کے لیے ماسٹر-ڈیٹیل)۔

UINavigationController اسٹیک میں منتقلی کو منظم کرتا ہے — push اسکرین شامل کرتا ہے، pop ہٹاتا ہے۔ UITabBarController ایپلیکیشن کے آزاد حصوں کے درمیان سوئچ کرتا ہے۔ UISplitViewController iPad پر دو کنٹرولرز ساتھ ساتھ اور iPhone پر ایک دکھاتا ہے۔ ڈیولپر addChild کے ذریعے کسٹم کنٹینر بنا سکتا ہے۔

swift
// کسٹم 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۔ ترتیب کی خلاف ورزی میموری لیک کا سبب بنتی ہے۔

MVVM اور Coordinator کے ساتھ Massive View Controller کا حل

Massive View Controller کا مسئلہ اس وقت ہوتا ہے جب UIViewController میں کاروباری منطق، نیٹ ورک کی درخواستیں، نیویگیشن اور UI کوڈ کی سینکڑوں لائنیں ہوتی ہیں۔ Apple اس مسئلے کو تسلیم کرتا ہے اور نیویگیشن نکالنے کے لیے Coordinator کے ساتھ MVVM (Model-View-ViewModel) کی سفارش کرتا ہے۔

MVVM کاروباری منطق کو کنٹرولر سے ViewModel میں منتقل کرتا ہے۔ Controller صرف ViewModel کو Combine یا ڈیلیگیٹ کے ذریعے View سے جوڑتا ہے۔ Coordinator نیویگیشن منطق — کنٹرولرز کے درمیان تخلیق اور منتقلی — کو ایک علیحدہ کلاس میں نکالتا ہے۔ یہ طریقہ 2024 سے Apple کی بہترین کارکردگی میں اپنایا گیا ہے۔

swift
// 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: کب کیا منتخب کریں

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 + UIViewPreviewUIViewControllerRepresentable کے ذریعے
CollectionViewUICollectionView + UICollectionViewLayoutLazyVGrid/LazyHGrid
iPad موافقتUISplitViewController + UITraitCollectionNavigationSplitView + sizeClass
ترقی کی رفتارسست (دستی لے آؤٹ)تیز (اعلانیہ)

اکثر پوچھے گئے سوالات

UIViewController UIView سے کیسے مختلف ہے؟

UIViewController ایک کنٹرولر ہے جو اسکرین اور اس کے لائف سائیکل کا انتظام کرتا ہے۔ UIView ایک ویو ہے جو مواد ڈسپلے کرتا ہے۔ ViewController میں UIViews کا درجہ بندی ہوتا ہے لیکن یہ خود بصری عنصر نہیں ہے۔ ایک کنٹرولر متعدد ویوز کا انتظام کرتا ہے۔

Massive View Controller کیا ہے؟

Massive View Controller ایک اینٹی پیٹرن ہے جہاں UIViewController میں بہت زیادہ منطق ہوتی ہے: ڈیٹا، نیویگیشن، نیٹ ورک کی درخواستیں، اینیمیشن۔ حل — علیحدہ سروسز، کوآرڈینیٹرز اور ViewModel (MVVM) میں کوڈ نکالنا ہے۔

ViewControllers کے درمیان ڈیٹا کیسے منتقل کیا جائے؟

چار طریقے: prepare(for:sender:) (Segue) میں پراپرٹی کے ذریعے، ڈیلیگیٹ (Delegate) کے ذریعے، کلوزر (Closure) کے ذریعے، مشترکہ سروس کے ذریعے۔ کمزور جوڑے کے لیے، Coordinator + Delegate یا Combine استعمال کریں۔

Container View Controller کیا ہے؟

Container View Controller ایک کنٹرولر ہے جو چائلڈ ViewController کا انتظام کرتا ہے۔ مثالیں: UINavigationController، UITabBarController، UISplitViewController۔ پیرنٹ کنٹرولر addChild کے ذریعے بچوں کو شامل کرتا ہے، ان کے درمیان سوئچ کرتا ہے اور ان کے لے آؤٹ کا انتظام کرتا ہے۔

SwiftUI View کے بجائے UIViewController کب استعمال کریں؟

UIViewController — پیچیدہ کسٹم اینیمیشنز، کیمرہ کام، نقشے، ویڈیو، کسٹم لے آؤٹ کے ساتھ UICollectionView کے لیے۔ SwiftUI View — iOS 13+ پر معیاری انٹرفیس کے لیے۔ UIHostingController کے ذریعے یکجا کرنا قابل قبول ہے۔

خلاصہ

  • UIViewController — اسکرین، UIView درجہ بندی اور لائف سائیکل کے انتظام کے لیے مرکزی UIKit کلاس
  • Lifecycle پانچ طریقوں پر مشتمل ہے: viewDidLoad، viewWillAppear، viewDidAppear، viewWillDisappear، viewDidDisappear
  • viewDidLoad — ابتدائی UI سیٹ اپ کا نقطہ، کنٹرولر کی زندگی میں ایک بار کال ہوتا ہے
  • viewWillAppear — ڈسپلے سے پہلے ہر بار کال ہوتا ہے، ڈیٹا اپ ڈیٹ اور نیویگیشن بار ترتیب دینے کے لیے موزوں ہے
  • Container View Controller (UINavigationController، UITabBarController) چائلڈ کنٹرولرز کے درجہ بندی کا انتظام کرتا ہے
  • Massive View Controller MVVM (ViewModel میں منطق نکالنا) اور Coordinator (نیویگیشن نکالنا) سے حل کیا جاتا ہے
  • UIViewController اور SwiftUI کو ہائبرڈ ایپلیکیشنز کے لیے UIHostingController اور UIViewRepresentable کے ذریعے یکجا کیا جا سکتا ہے

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں