UIViewController — iOS tətbiqinin mərkəzi sinfi, ekranı və onun məzmununu idarə edir. iPhone və ya iPad-in hər ekranı bir ViewController tərəfindən idarə olunur, o, göstərmə, həyat dövrü və naviqasiyanı koordinasiya edir. UIKit arxitekturası haqqında daha ətraflı Apple-ın rəsmi sənədlərində oxuyun.
Əsas məqamlar
UIViewController — UIKit freymvorkundan olan sinif, UIView iyerarxiyasını idarə edir və ekranda məlumat göstərilməsini koordinasiya edir. Hər iOS tətbiqində ən azı bir ViewController — pəncərənin kök kontrolleri var. Kontroller ekran dönmələrini, ekranlar arası keçidləri və həyat dövrü hadisələrini emal edir.
MVC (Model-View-Controller) arxitekturası iOS-da məhz UIViewController vasitəsilə həyata keçirilir: kontroller modeldən məlumat alır və görünüşü yeniləyir. ViewController vizual element deyil — o, subview iyerarxiyasını ehtiva edən view xüsusiyyətini idarə edir. Apple-ın məlumatına görə (2026), UIKit 40-dan çox daxili UIViewController alt sinfini ehtiva edir.
İlk iPhone SDK (2008) üç həyat dövrü metodu olan UIViewController-i ehtiva edirdi. 18 il ərzində Apple Container View Controller dəstəyi, adaptiv təqdimatlar, xüsusi animasiyalar üçün UIViewControllerTransitioningDelegate və iPad-də bölünmüş ekran rejimi əlavə etdi. UIViewController UIKit-də tətbiqlər üçün məcburi komponent olaraq qalır.
UIViewController-ın həyat dövrü — sistem tərəfindən ekran yaradılarkən, göstərilərkən və gizlədilərkən çağrılan metodlar ardıcıllığıdır. Həyat dövrünü başa düşmək kritik əhəmiyyət daşıyır: kodun səhv yerləşdirilməsi yaddaş sızmalarına, lazımsız şəbəkə sorğularına və interfeysin titrəməsinə gətirib çıxarır.
| Metod | Çağrılma anı | Təyinat |
|---|---|---|
| viewDidLoad | Bir dəfə, view yaddaşa yükləndikdən sonra | İlkin UI qurulumu, Combine abunəliyi |
| viewWillAppear | Ekran görünməzdən əvvəl | Məlumat yeniləmə, navigation bar gizlətmə/göstərmə |
| viewDidAppear | Ekran göründükdən sonra | Animasiyaları işə salma, analitika, kamera yeniləmə |
| viewWillDisappear | Ekrandan çıxmazdan əvvəl | Qaralamaları yadda saxlama, bildirişlərdən imtina |
| viewDidDisappear | Ekrandan çıxdıqdan sonra | Ağır prosesləri dayandırma, resursları boşaltma |
Ekran ilk dəfə göstəriləndə ardıcıllıq: init → loadView → viewDidLoad → viewWillAppear → viewDidAppear. Təkrar görünəndə (başqa ekrandan qayıdış): viewWillAppear → viewDidAppear. viewDidLoad kontrollerin ömrü boyu yalnız bir dəfə çağrılır.
viewDidLoad metodu — istifadəçi interfeysinin qurulması üçün əsas nöqtədir. View yaddaşa yükləndikdən sonra, bütün IBOutlet-lər artıq bağlandıqda çağrılır. Burada UI elementləri proqramlı şəkildə yaradılır, constraints konfiqurasiya edilir, ilkin məlumatlar yüklənir.
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-də bu kod View-in gövdəsinin ekvivalentidir. Lakin UIViewController həyat dövrü və optimallaşdırma üzərində tam nəzarət verir. bindViewModel reaktiv abunəlik üçün Combine istifadə edir — məlumatlar model dəyişdikdə avtomatik yenilənir.
viewWillAppear hər dəfə ekran görünməzdən əvvəl çağrılır, hətta yaddaşda olsa belə. Bu, başqa ekranda dəyişə bilən məlumatları yeniləmək üçün yerdir: siyahını yenidən yükləmək, bildiriş sayğacını yeniləmək, konkret ekran üçün navigation bar qurmaq.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Bu ekranda navigation bar-ı gizlət
navigationController?.setNavigationBarHidden(true, animated: animated)
// Başqa ekrandan qayıdarkən məlumatları yenilə
tableView.reloadData()
badgeLabel.text = "\(CartManager.shared.itemCount)"
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Analitika: yalnız istifadəçi ekranı gördükdən sonra
AnalyticsService.shared.logScreenView("Profile")
}viewDidLoad və viewWillAppear arasındakı fərq kritikdir: viewDidLoad bir dəfə icra olunur və statik qurulum üçün uyğundur, viewWillAppear — hər göstəriləndə, dinamik yeniləmələr üçün uyğundur. Şəbəkə sorğularını viewDidLoad-da yerləşdirmək ekrana qayıtdıqda köhnəlmiş məlumatların göstərilməsinə səbəb olacaq.
Container View Controller — bir və ya bir neçə alt ViewController-ı idarə edən ViewController. Apple üç daxili konteyner təqdim edir: UINavigationController (ekran yığını), UITabBarController (tablar) və UISplitViewController (iPad üçün master-detail).
UINavigationController keçidləri yığın şəklində təşkil edir — push ekran əlavə edir, pop silir. UITabBarController tətbiqin müstəqil bölmələri arasında keçid edir. UISplitViewController iPad-də iki kontrolleri yan-yana, iPhone-da isə birini göstərir. Tərtibatçı addChild vasitəsilə öz konteynerini yarada bilər.
// Xüsusi Container View Controller
final class ContainerViewController: UIViewController {
private let sidebarVC = SidebarViewController()
private let contentVC = ContentViewController()
override func viewDidLoad() {
super.viewDidLoad()
// Alt kontrollerin əlavə edilməsi
addChild(sidebarVC)
view.addSubview(sidebarVC.view)
sidebarVC.didMove(toParent: self)
addChild(contentVC)
view.addSubview(contentVC.view)
contentVC.didMove(toParent: self)
}
}Container View Controller ilə düzgün iş addChild, view əlavə etmə və didMove(toParent:) çağırma ardıcıllığını tələb edir. Silərkən — willMove(toParent: nil), removeFromSuperview, removeFromParent. Ardıcıllığın pozulması yaddaş sızmalarına gətirib çıxarır.
Massive View Controller problemi — UIViewController yüzlərlə sətir kod ehtiva etdikdə: biznes məntiqi, şəbəkə sorğuları, naviqasiya və UI kodu. Apple problemi dərk edir və naviqasiyanı ayırmaq üçün MVVM (Model-View-ViewModel) ilə birlikdə Coordinator tövsiyə edir.
MVVM biznes məntiqini kontrollerdən ViewModel-ə köçürür. Controller yalnız ViewModel-i View ilə Combine və ya delegate vasitəsilə birləşdirir. Coordinator naviqasiya məntiqini — kontrollerlər arasında yaratma və keçid — ayrıca sinfə çıxarır. Bu yanaşma 2024-cü ildən Apple-ın ən yaxşı təcrübələrinə daxil edilmişdir.
// Coordinator — naviqasiyanın idarə edilməsi
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 və SwiftUI View arasında seçim layihənin başlama ilindən, fərdiləşdirmə tələblərindən və minimum dəstəklənən iOS versiyasından asılıdır. UIViewController ilə UIKit 2020-ci ildən əvvəl başlanmış layihələr və dərin interfeys fərdiləşdirməsi olan tətbiqlər üçün əsas olaraq qalır.
SwiftUI iOS 17+ ilə yeni layihələr, standart interfeyslər və prototiplər üçün uyğundur. Lakin xüsusi keçidlər, kamera işi, MapKit, mürəkkəb CALayer animasiyaları üçün UIViewController tələb olunur. Apple yanaşmaları UIHostingController (SwiftUI UIKit daxilində) və UIViewRepresentable (UIKit SwiftUI daxilində) vasitəsilə birləşdirməyi tövsiyə edir.
| Ssenari | UIKit (UIViewController) | SwiftUI (View) |
|---|---|---|
| Xüsusi animasiya | UIViewPropertyAnimator vasitəsilə tam nəzarət | Animation vasitəsilə məhdud |
| Kamera ilə iş | AVCaptureSession + UIViewPreview | UIViewControllerRepresentable vasitəsilə |
| CollectionView | UICollectionView + UICollectionViewLayout | LazyVGrid/LazyHGrid |
| iPad adaptasiyası | UISplitViewController + UITraitCollection | NavigationSplitView + sizeClass |
| İnkişaf sürəti | Daha yavaş (əl layout) | Daha sürətli (deklarativ) |
Tez-tez verilən suallar
UIViewController — ekranı və onun həyat dövrünü idarə edən kontroller. UIView — məzmunu göstərən görünüş. ViewController UIView iyerarxiyasını ehtiva edir, lakin özü vizual element deyil. Bir kontroller çoxlu görünüşləri idarə edir.
Massive View Controller — UIViewController çox məntiq ehtiva etdikdə anti-nümunə: məlumatlar, naviqasiya, şəbəkə sorğuları, animasiyalar. Həll — kodu ayrıca xidmətlərə, koordinatorlara və ViewModel-ə (MVVM) çıxarmaq.
Dörd üsul: prepare(for:sender:) (Segue) zamanı xassə vasitəsilə, delegate vasitəsilə, closure vasitəsilə, ümumi xidmət vasitəsilə. Zəif bağlantı üçün Coordinator + Delegate və ya Combine istifadə olunur.
Container View Controller — alt ViewController-ları idarə edən kontroller. Nümunələr: UINavigationController, UITabBarController, UISplitViewController. Valideyn kontrolleri alt kontrollerləri addChild vasitəsilə əlavə edir, onlar arasında keçid edir və layoutlarını idarə edir.
UIViewController — mürəkkəb xüsusi animasiya, kamera, xəritə, video, xüsusi layout ilə UICollectionView üçün. SwiftUI View — iOS 13+ standart interfeysləri üçün. UIHostingController vasitəsilə birləşdirməyə icazə verilir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun