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 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 — 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.
| Metod | Chaqirilish vaqti | Maqsad |
|---|---|---|
| viewDidLoad | Bir marta, view xotiraga yuklangandan so'ng | Dastlabki UI sozlamalari, Combine obunasi |
| viewWillAppear | Ekran ko'rinishidan oldin | Ma'lumotlarni yangilash, navigation barni yashirish/ko'rsatish |
| viewDidAppear | Ekran ko'ringandan so'ng | Animatsiyalarni ishga tushirish, analitika, kamerani yangilash |
| viewWillDisappear | Ekrandan chiqishdan oldin | Qoralamalarni saqlash, bildirishlardan voz kechish |
| viewDidDisappear | Ekrandan chiqqandan so'ng | Og'ir jarayonlarni to'xtatish, resurslarni bo'shatish |
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 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.
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 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.
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 — 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.
// 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 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.
// 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 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.
| Ssenariy | UIKit (UIViewController) | SwiftUI (View) |
|---|---|---|
| Maxsus animatsiya | UIViewPropertyAnimator orqali to'liq nazorat | Animation orqali cheklangan |
| Kamera bilan ishlash | AVCaptureSession + UIViewPreview | UIViewControllerRepresentable orqali |
| CollectionView | UICollectionView + UICollectionViewLayout | LazyVGrid/LazyHGrid |
| iPad moslashuvi | UISplitViewController + UITraitCollection | NavigationSplitView + sizeClass |
| Rivojlanish tezligi | Sekinroq (qo'lda layout) | Tezroq (deklarativ) |
Tez-tez so'raladigan savollar
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 — 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.
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 — tobe ViewController-larni boshqaruvchi boshqaruvchi. Misollar: UINavigationController, UITabBarController, UISplitViewController. Ota-ona boshqaruvchi tobelarni addChild orqali qo'shadi, ular orasida almashadi va ularning layoutini boshqaradi.
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
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.