UIViewController iOS अनुप्रयोगों का केंद्रीय वर्ग है, जो स्क्रीन और उसकी सामग्री का प्रबंधन करता है। प्रत्येक iPhone या iPad स्क्रीन एक ViewController द्वारा प्रबंधित होती है, जो प्रदर्शन, जीवनचक्र और नेविगेशन का समन्वय करता है। UIKit आर्किटेक्चर के बारे में और अधिक पढ़ें Apple के आधिकारिक दस्तावेज़ में।
मुख्य बिंदु
UIViewController UIKit फ्रेमवर्क का एक वर्ग है जो UIView के पदानुक्रम का प्रबंधन करता है और स्क्रीन पर डेटा प्रदर्शन का समन्वय करता है। प्रत्येक iOS एप्लिकेशन में कम से कम एक ViewController होता है — विंडो का मूल नियंत्रक। नियंत्रक स्क्रीन घुमाव, स्क्रीन के बीच संक्रमण और जीवनचक्र घटनाओं को संभालता है।
iOS में MVC (Model-View-Controller) आर्किटेक्चर UIViewController के माध्यम से ही कार्यान्वित किया जाता है: नियंत्रक मॉडल से डेटा प्राप्त करता है और दृश्य को अद्यतन करता है। ViewController एक दृश्य तत्व नहीं है — यह view प्रॉपर्टी का प्रबंधन करता है जिसमें subview का पदानुक्रम होता है। Apple (2026) के अनुसार, UIKit में 40 से अधिक अंतर्निहित UIViewController उपवर्ग हैं।
पहले iPhone SDK (2008) में तीन जीवनचक्र विधियों के साथ UIViewController शामिल था। 18 वर्षों में, Apple ने Container View Controller, अनुकूली प्रस्तुतियाँ, कस्टम एनिमेशन के लिए UIViewControllerTransitioningDelegate और iPad पर विभाजित स्क्रीन मोड के लिए समर्थन जोड़ा। UIViewController UIKit अनुप्रयोगों के लिए एक अनिवार्य घटक बना हुआ है।
UIViewController का जीवनचक्र — स्क्रीन बनाने, प्रदर्शित करने और छिपाने पर सिस्टम द्वारा कॉल की जाने वाली विधियों का एक क्रम है। Lifecycle को समझना अत्यंत महत्वपूर्ण है: कोड का गलत स्थान मेमोरी लीक, अनावश्यक नेटवर्क अनुरोध और इंटरफ़ेस झिलमिलाहट का कारण बनता है।
| विधि | कॉल का क्षण | उद्देश्य |
|---|---|---|
| viewDidLoad | एक बार, view के मेमोरी में लोड होने के बाद | प्रारंभिक UI सेटअप, Combine सदस्यता |
| viewWillAppear | स्क्रीन प्रकट होने से पहले | डेटा अद्यतन, नेविगेशन बार छिपाना/दिखाना |
| viewDidAppear | स्क्रीन प्रकट होने के बाद | एनिमेशन शुरू करना, विश्लेषण, कैमरा अद्यतन |
| viewWillDisappear | स्क्रीन से जाने से पहले | ड्राफ्ट सहेजना, सूचनाओं से सदस्यता समाप्त करना |
| viewDidDisappear | स्क्रीन से जाने के बाद | भारी प्रक्रियाओं को रोकना, संसाधन मुक्त करना |
स्क्रीन के पहली बार प्रदर्शित होने पर क्रम: init → loadView → viewDidLoad → viewWillAppear → viewDidAppear। पुनः प्रकट होने पर (दूसरी स्क्रीन से वापसी): viewWillAppear → viewDidAppear। viewDidLoad नियंत्रक के जीवनकाल में केवल एक बार कॉल होता है।
viewDidLoad विधि उपयोगकर्ता इंटरफ़ेस को कॉन्फ़िगर करने का मुख्य बिंदु है। यह view के मेमोरी में लोड होने के बाद कॉल होती है, जब सभी IBOutlet कनेक्शन पहले से स्थापित हो चुके होते हैं। यहाँ UI तत्व प्रोग्रामेटिक रूप से बनाए जाते हैं, constraints कॉन्फ़िगर किए जाते हैं, और प्रारंभिक डेटा लोड किया जाता है।
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 स्क्रीन प्रकट होने से पहले हर बार कॉल होता है, भले ही वह पहले से मेमोरी में हो। यह उन डेटा को अद्यतन करने का स्थान है जो किसी अन्य स्क्रीन पर बदल सकते हैं: सूची को पुनः लोड करना, सूचना बैज को अद्यतन करना, विशिष्ट स्क्रीन के लिए नेविगेशन बार कॉन्फ़िगर करना।
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 एक ViewController है जो एक या अधिक चाइल्ड ViewController का प्रबंधन करता है। Apple तीन अंतर्निहित कंटेनर प्रदान करता है: UINavigationController (स्क्रीन स्टैक), UITabBarController (टैब), और UISplitViewController (iPad के लिए मास्टर-डिटेल)।
UINavigationController स्टैक में संक्रमण व्यवस्थित करता है — push स्क्रीन जोड़ता है, pop हटाता है। UITabBarController एप्लिकेशन के स्वतंत्र अनुभागों के बीच स्विच करता है। UISplitViewController iPad पर दो नियंत्रकों को साथ-साथ और iPhone पर एक दिखाता है। डेवलपर addChild के माध्यम से कस्टम कंटेनर बना सकता है।
// कस्टम 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। क्रम का उल्लंघन मेमोरी लीक का कारण बनता है।
Massive View Controller समस्या तब होती है जब UIViewController में व्यावसायिक तर्क, नेटवर्क अनुरोध, नेविगेशन और UI कोड के सैकड़ों पंक्तियाँ होती हैं। Apple समस्या को स्वीकार करता है और नेविगेशन निकालने के लिए Coordinator के साथ MVVM (Model-View-ViewModel) की सिफारिश करता है।
MVVM व्यावसायिक तर्क को नियंत्रक से ViewModel में स्थानांतरित करता है। Controller केवल ViewModel को Combine या डेलिगेट के माध्यम से View से जोड़ता है। Coordinator नेविगेशन तर्क — नियंत्रकों के बीच निर्माण और संक्रमण — को एक अलग वर्ग में निकालता है। यह दृष्टिकोण 2024 से Apple की सर्वोत्तम प्रथाओं में शामिल किया गया है।
// 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 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 + UIViewPreview | UIViewControllerRepresentable के माध्यम से |
| CollectionView | UICollectionView + UICollectionViewLayout | LazyVGrid/LazyHGrid |
| iPad अनुकूलन | UISplitViewController + UITraitCollection | NavigationSplitView + sizeClass |
| विकास गति | धीमी (मैन्युअल लेआउट) | तेज़ (घोषणात्मक) |
अक्सर पूछे जाने वाले प्रश्न
UIViewController एक नियंत्रक है जो स्क्रीन और उसके जीवनचक्र का प्रबंधन करता है। UIView एक दृश्य है जो सामग्री प्रदर्शित करता है। ViewController में UIViews का पदानुक्रम होता है लेकिन वह स्वयं एक दृश्य तत्व नहीं है। एक नियंत्रक कई दृश्यों का प्रबंधन करता है।
Massive View Controller एक एंटी-पैटर्न है जहाँ UIViewController में बहुत अधिक तर्क होता है: डेटा, नेविगेशन, नेटवर्क अनुरोध, एनिमेशन। समाधान — कोड को अलग सेवाओं, कोऑर्डिनेटर और ViewModel (MVVM) में निकालना है।
चार तरीके: prepare(for:sender:) (Segue) में प्रॉपर्टी के माध्यम से, डेलिगेट (Delegate) के माध्यम से, क्लोज़र (Closure) के माध्यम से, साझा सेवा के माध्यम से। ढीले युग्मन के लिए, Coordinator + Delegate या Combine का उपयोग करें।
Container View Controller एक नियंत्रक है जो चाइल्ड ViewController का प्रबंधन करता है। उदाहरण: UINavigationController, UITabBarController, UISplitViewController। मूल नियंत्रक addChild के माध्यम से बच्चों को जोड़ता है, उनके बीच स्विच करता है और उनके लेआउट का प्रबंधन करता है।
UIViewController — जटिल कस्टम एनिमेशन, कैमरा कार्य, मानचित्र, वीडियो, कस्टम लेआउट वाले UICollectionView के लिए। SwiftUI View — iOS 13+ पर मानक इंटरफ़ेस के लिए। UIHostingController के माध्यम से संयोजन स्वीकार्य है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें