ViewController — mohiyati, iOS-da ekran boshqaruvchisi va uning Lifecycle

Muallif: IT Sectr Nashr etilgan: 2026-02-22 O'qish vaqti: 7 daq

UIViewController — iOS ilovasining markaziy klassi, ekran va uning mazmunini boshqaradi. iPhone yoki iPad-ning har bir ekrani bitta ViewController tomonidan boshqariladi, u ko'rsatish, hayotiy sikl va navigatsiyani muvofiqlashtiradi. UIKit arxitekturasi haqida batafsil Apple rasmiy hujjatlarida o'qing.

Asosiy fikrlar

  • UIViewController — UIKit-da o'z hayotiy sikli bilan ekranni boshqarish uchun asosiy sinf
  • viewDidLoad — bir marta chaqiriladi, UI-initsializatsiya va ma'lumotlarga obuna nuqtasi
  • viewWillAppear — ekran tez orada ko'rinadigan bo'ladi, ko'rsatishdan oldin ma'lumotlarni yangilash
  • Lifecycle besh metodni o'z ichiga oladi: viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear
  • Massive View Controller — iOS-ning asosiy antinamunasi, MVVM yoki Coordinator orqali hal qilinadi

ViewController nima?

UIViewController — UIKit frameworkidagi sinf, UIView ierarxiyasini boshqaradi va ekranda ma'lumotlarni ko'rsatishni muvofiqlashtiradi. Har bir iOS ilovasi kamida bitta ViewController — oynaning ildiz boshqaruvchisini o'z ichiga oladi. Boshqaruvchi ekran aylanishlari, ekranlararo o'tishlar va hayotiy sikl hodisalarini qayta ishlaydi.

MVC (Model-View-Controller) arxitekturasi iOS-da aynan UIViewController orqali amalga oshiriladi: boshqaruvchi modeldan ma'lumotlarni oladi va ko'rinishni yangilaydi. ViewController vizual element emas — u subview ierarxiyasini o'z ichiga olgan view xususiyatini boshqaradi. Apple ma'lumotlariga ko'ra (2026), UIKit 40 dan ortiq o'rnatilgan UIViewController kichik sinflarini o'z ichiga oladi.

Birinchi iPhone SDK (2008) uchta hayotiy sikl metodiga ega UIViewController-ni o'z ichiga olgan. 18 yil davomida Apple Container View Controller qo'llab-quvvatlash, adaptiv taqdimotlar, maxsus animatsiyalar uchun UIViewControllerTransitioningDelegate va iPad-da bo'lingan ekran rejimini qo'shdi. UIViewController UIKit ilovalari uchun majburiy komponent bo'lib qoladi.

UIViewController hayotiy sikli

UIViewController hayotiy sikli — tizim tomonidan ekran yaratilganda, ko'rsatilganda va yashirilganda chaqiriladigan metodlar ketma-ketligi. Hayotiy siklini tushunish juda muhim: kodni noto'g'ri joylashtirish xotira oqishiga, keraksiz tarmoq so'rovlariga va interfeysning miltillashiga olib keladi.

MetodChaqirilish vaqtiMaqsad
viewDidLoadBir marta, view xotiraga yuklangandan so'ngDastlabki UI sozlamalari, Combine obunasi
viewWillAppearEkran ko'rinishidan oldinMa'lumotlarni yangilash, navigation barni yashirish/ko'rsatish
viewDidAppearEkran ko'ringandan so'ngAnimatsiyalarni ishga tushirish, analitika, kamerani yangilash
viewWillDisappearEkrandan chiqishdan oldinQoralamalarni saqlash, bildirishlardan voz kechish
viewDidDisappearEkrandan chiqqandan so'ngOg'ir jarayonlarni to'xtatish, resurslarni bo'shatish

Ekran ko'ringanda chaqirilish tartibi

Ekran birinchi marta ko'rsatilganda ketma-ketlik: init → loadView → viewDidLoad → viewWillAppear → viewDidAppear. Qayta ko'ringanda (boshqa ekrandan qaytish): viewWillAppear → viewDidAppear. viewDidLoad boshqaruvchining hayoti davomida faqat bir marta chaqiriladi.

viewDidLoad, init va UI sozlamalari

viewDidLoad metodi — foydalanuvchi interfeysini sozlashning asosiy nuqtasi. View xotiraga yuklangandan so'ng, barcha IBOutletlar ulangan bo'lganda chaqiriladi. Bu yerda UI elementlari dasturiy ravishda yaratiladi, constraints sozlanadi, dastlabki ma'lumotlar yuklanadi.

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-da bu kod View tanasining ekvivalentidir. Ammo UIViewController hayotiy sikl va optimallashtirish ustidan to'liq nazorat beradi. bindViewModel reaktiv obuna uchun Combine-dan foydalanadi — ma'lumotlar model o'zgarganda avtomatik yangilanadi.

viewWillAppear va ma'lumotlarni yangilash

viewWillAppear har safar ekran ko'rinishidan oldin chaqiriladi, hatto u xotirada bo'lsa ham. Bu boshqa ekranda o'zgarishi mumkin bo'lgan ma'lumotlarni yangilash joyi: ro'yxatni qayta yuklash, bildirish hisoblagichini yangilash, muayyan ekran uchun navigation barni sozlash.

swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Bu ekranda navigation barni yashirish
    navigationController?.setNavigationBarHidden(true, animated: animated)

    // Boshqa ekrandan qaytganda ma'lumotlarni yangilash
    tableView.reloadData()
    badgeLabel.text = "\(CartManager.shared.itemCount)"
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // Analitika: faqat foydalanuvchi ekranni ko'rganidan so'ng
    AnalyticsService.shared.logScreenView("Profile")
}

viewDidLoad va viewWillAppear o'rtasidagi farq muhim: viewDidLoad bir marta bajariladi va statik sozlash uchun mos, viewWillAppear — har ko'rsatishda, dinamik yangilanishlar uchun mos. Tarmoq so'rovlarini viewDidLoad-ga joylashtirish ekranga qaytganda eskirgan ma'lumotlarni ko'rsatishga olib keladi.

Container View Controller: UINavigationController va UITabBarController

Container View Controller — bir yoki bir nechta tobe ViewController-larni boshqaradigan ViewController. Apple uchta o'rnatilgan konteynerni taqdim etadi: UINavigationController (ekranlar to'plami), UITabBarController (yorliqlar) va UISplitViewController (iPad uchun master-detail).

UINavigationController o'tishlarni to'plam shaklida tashkil qiladi — push ekran qo'shadi, pop olib tashlaydi. UITabBarController ilovaning mustaqil bo'limlari o'rtasida almashadi. UISplitViewController iPad-da ikkita boshqaruvchini yonma-yon, iPhone-da esa bittasini ko'rsatadi. Dasturchi addChild orqali o'z konteynerini yaratishi mumkin.

swift
// Maxsus Container View Controller
final class ContainerViewController: UIViewController {

    private let sidebarVC = SidebarViewController()
    private let contentVC = ContentViewController()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Tobe boshqaruvchini qo'shish
        addChild(sidebarVC)
        view.addSubview(sidebarVC.view)
        sidebarVC.didMove(toParent: self)

        addChild(contentVC)
        view.addSubview(contentVC.view)
        contentVC.didMove(toParent: self)
    }
}

Container View Controller bilan to'g'ri ishlash addChild, view qo'shish va didMove(toParent:) chaqirish ketma-ketligini talab qiladi. O'chirishda — willMove(toParent: nil), removeFromSuperview, removeFromParent. Ketma-ketlikni buzish xotira oqishiga olib keladi.

Massive View Controller-ni MVVM va Coordinator orqali hal qilish

Massive View Controller muammosi — UIViewController yuzlab satr kodni o'z ichiga olganda: biznes mantiq, tarmoq so'rovlari, navigatsiya va UI kod. Apple muammoni tushunadi va navigatsiyani ajratish uchun MVVM (Model-View-ViewModel) bilan birgalikda Coordinator-ni tavsiya qiladi.

MVVM biznes mantiqini boshqaruvchidan ViewModel-ga o'tkazadi. Controller faqat ViewModel-ni View bilan Combine yoki delegate orqali bog'laydi. Coordinator navigatsiya mantiqini — boshqaruvchilar yaratish va ular o'rtasida o'tish — alohida sinfga chiqaradi. Bu yondashuv 2024 yildan boshlab Apple-ning eng yaxshi amaliyotlariga kiritilgan.

swift
// Coordinator — navigatsiyani boshqarish
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 vs SwiftUI: qachon nimani tanlash

UIViewController va SwiftUI View o'rtasidagi tanlov loyihaning boshlanish yiliga, sozlash talablariga va minimal qo'llab-quvvatlanadigan iOS versiyasiga bog'liq. UIKit UIViewController bilan 2020 yilgacha boshlangan loyihalar va chuqur interfeys sozlashga ega ilovalar uchun asos bo'lib qoladi.

SwiftUI iOS 17+ bilan yangi loyihalar, standart interfeyslar va prototiplar uchun mos keladi. Lekin maxsus o'tishlar, kamera bilan ishlash, MapKit, murakkab CALayer animatsiyalari uchun UIViewController talab qilinadi. Apple yondashuvlarni UIHostingController (SwiftUI UIKit ichida) va UIViewRepresentable (UIKit SwiftUI ichida) orqali birlashtirishni tavsiya qiladi.

SsenariyUIKit (UIViewController)SwiftUI (View)
Maxsus animatsiyaUIViewPropertyAnimator orqali to'liq nazoratAnimation orqali cheklangan
Kamera bilan ishlashAVCaptureSession + UIViewPreviewUIViewControllerRepresentable orqali
CollectionViewUICollectionView + UICollectionViewLayoutLazyVGrid/LazyHGrid
iPad moslashuviUISplitViewController + UITraitCollectionNavigationSplitView + sizeClass
Rivojlanish tezligiSekinroq (qo'lda layout)Tezroq (deklarativ)

Tez-tez so'raladigan savollar

UIViewController UIView-dan nimasi bilan farq qiladi?

UIViewController — ekran va uning hayotiy siklini boshqaruvchi boshqaruvchi. UIView — mazmunni ko'rsatuvchi ko'rinish. ViewController UIView ierarxiyasini o'z ichiga oladi, lekin o'zi vizual element emas. Bitta boshqaruvchi ko'plab ko'rinishlarni boshqaradi.

Massive View Controller nima?

Massive View Controller — UIViewController juda ko'p mantiqni o'z ichiga olganda antinamuna: ma'lumotlar, navigatsiya, tarmoq so'rovlari, animatsiyalar. Yechim — kodni alohida xizmatlar, koordinatorlar va ViewModel (MVVM) ga chiqarish.

ViewController o'rtasida ma'lumotlarni qanday uzatish mumkin?

To'rt usul: prepare(for:sender:) (Segue) da xususiyat orqali, Delegate orqali, Closure orqali, umumiy xizmat orqali. Zaif bog'lanish uchun Coordinator + Delegate yoki Combine ishlatiladi.

Container View Controller nima?

Container View Controller — tobe ViewController-larni boshqaruvchi boshqaruvchi. Misollar: UINavigationController, UITabBarController, UISplitViewController. Ota-ona boshqaruvchi tobelarni addChild orqali qo'shadi, ular orasida almashadi va ularning layoutini boshqaradi.

Qachon UIViewController-ni SwiftUI View o'rniga ishlatish kerak?

UIViewController — murakkab maxsus animatsiya, kamera, xarita, video, maxsus layout bilan UICollectionView uchun. SwiftUI View — iOS 13+ standart interfeyslari uchun. UIHostingController orqali birlashtirishga ruxsat beriladi.

Xulosa

  • UIViewController — ekran, UIView ierarxiyasi va hayotiy siklini boshqarish uchun UIKit-ning markaziy sinfi
  • Hayotiy sikl besh metoddan iborat: viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear
  • viewDidLoad — dastlabki UI sozlash nuqtasi, boshqaruvchining hayoti davomida bir marta chaqiriladi
  • viewWillAppear — har ko'rsatishdan oldin chaqiriladi, ma'lumotlarni yangilash va navigation barni sozlash uchun mos
  • Container View Controller (UINavigationController, UITabBarController) tobe boshqaruvchilar ierarxiyasini boshqaradi
  • Massive View Controller MVVM (mantiqni ViewModel-ga chiqarish) va Coordinator (navigatsiyani chiqarish) orqali hal qilinadi
  • UIViewController va SwiftUI gibrid ilovalar uchun UIHostingController va UIViewRepresentable orqali birlashtirilishi mumkin

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing