ViewController — mahiyyəti, iOS-da ekran kontrolleri və onun Lifecycle

Müəllif: IT Sectr Dərc olunub: 2026-02-22 Oxuma vaxtı: 7 dəq

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-də öz həyat dövrü ilə ekranı idarə etmək üçün əsas sinif
  • viewDidLoad — bir dəfə çağırılır, UI-inisializasiya və məlumat abunəliyi nöqtəsi
  • viewWillAppear — ekran tezliklə görünəcək, göstərilməzdən əvvəl məlumat yeniləmə
  • Lifecycle beş metodu əhatə edir: viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear
  • Massive View Controller — iOS-un əsas anti-nümunəsi, MVVM və ya Coordinator ilə həll olunur

ViewController nədir?

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ü

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
viewDidLoadBir dəfə, view yaddaşa yükləndikdən sonraİlkin UI qurulumu, Combine abunəliyi
viewWillAppearEkran görünməzdən əvvəlMəlumat yeniləmə, navigation bar gizlətmə/göstərmə
viewDidAppearEkran göründükdən sonraAnimasiyaları işə salma, analitika, kamera yeniləmə
viewWillDisappearEkrandan çıxmazdan əvvəlQaralamaları yadda saxlama, bildirişlərdən imtina
viewDidDisappearEkrandan çıxdıqdan sonraAğır prosesləri dayandırma, resursları boşaltma

Ekran görünəndə çağrılma sırası

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, init və UI qurulumu

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.

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-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 və məlumat yeniləmə

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.

swift
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: UINavigationController və UITabBarController

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.

swift
// 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-ın MVVM və Coordinator ilə həlli

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.

swift
// 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 vs SwiftUI: nə vaxt nə seçmək

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.

SsenariUIKit (UIViewController)SwiftUI (View)
Xüsusi animasiyaUIViewPropertyAnimator vasitəsilə tam nəzarətAnimation vasitəsilə məhdud
Kamera ilə işAVCaptureSession + UIViewPreviewUIViewControllerRepresentable vasitəsilə
CollectionViewUICollectionView + UICollectionViewLayoutLazyVGrid/LazyHGrid
iPad adaptasiyasıUISplitViewController + UITraitCollectionNavigationSplitView + sizeClass
İnkişaf sürətiDaha yavaş (əl layout)Daha sürətli (deklarativ)

Tez-tez verilən suallar

UIViewController UIView-dən nə ilə fərqlənir?

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 nədir?

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.

ViewController arasında məlumatı necə ötürmək olar?

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 nədir?

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.

Nə vaxt UIViewController-i SwiftUI View əvəzinə istifadə etməli?

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ə

  • UIViewController — ekranı, UIView iyerarxiyasını və həyat dövrünü idarə etmək üçün UIKit-in mərkəzi sinfi
  • Həyat dövrü beş metoddan ibarətdir: viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear
  • viewDidLoad — ilkin UI qurulum nöqtəsi, kontrollerin ömrü boyu bir dəfə çağrılır
  • viewWillAppear — hər göstərilməzdən əvvəl çağrılır, məlumat yeniləmə və navigation bar qurulumu üçün uyğundur
  • Container View Controller (UINavigationController, UITabBarController) alt kontrollerlər iyerarxiyasını idarə edir
  • Massive View Controller MVVM (məntiqin ViewModel-ə çıxarılması) və Coordinator (naviqasiyanın çıxarılması) vasitəsilə həll olunur
  • UIViewController və SwiftUI hibrid tətbiqlər üçün UIHostingController və UIViewRepresentable vasitəsilə birləşdirilə bilər

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.

Layihəni müzakirə et

Həm də oxuyun