ViewController — iOS এ স্ক্রিন কন্ট্রোলারের সারমর্ম এবং এর Lifecycle

লেখক: IT Sectr প্রকাশিত: 2026-02-22 পড়ার সময়: 7 মিনিট

UIViewController হল iOS অ্যাপ্লিকেশনের কেন্দ্রীয় ক্লাস, যা স্ক্রিন এবং এর বিষয়বস্তু পরিচালনা করে। প্রতিটি iPhone বা iPad স্ক্রিন একটি ViewController দ্বারা পরিচালিত হয়, যা প্রদর্শন, জীবনচক্র এবং নেভিগেশন সমন্বয় করে। UIKit আর্কিটেকচার সম্পর্কে আরও পড়ুন Apple এর অফিসিয়াল ডকুমেন্টেশনে

মূল পয়েন্ট

  • UIViewController — নিজস্ব জীবনচক্র সহ UIKit এ স্ক্রিন পরিচালনার জন্য বেস ক্লাস
  • viewDidLoad — একবার কল হয়, UI আরম্ভ এবং ডেটা সাবস্ক্রিপশনের বিন্দু
  • viewWillAppear — স্ক্রিন শীঘ্রই দৃশ্যমান হবে, প্রদর্শনের আগে ডেটা আপডেট
  • Lifecycle পাঁচটি মেথড অন্তর্ভুক্ত: viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear
  • Massive View Controller — iOS এর প্রধান অ্যান্টি-প্যাটার্ন, MVVM বা Coordinator এর মাধ্যমে সমাধান করা হয়

ViewController কি?

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 এর জীবনচক্র

UIViewController এর জীবনচক্র — স্ক্রিন তৈরি, প্রদর্শন এবং লুকানোর সময় সিস্টেম দ্বারা কল করা মেথডগুলির একটি ক্রম। Lifecycle বোঝা অত্যন্ত গুরুত্বপূর্ণ: ভুল স্থানে কোড স্থাপন মেমরি লিক, অপ্রয়োজনীয় নেটওয়ার্ক অনুরোধ এবং ইন্টারফেস ঝলকানির কারণ হয়।

মেথডকলের মুহূর্তউদ্দেশ্য
viewDidLoadএকবার, view মেমরিতে লোড হওয়ার পরপ্রাথমিক UI সেটআপ, Combine সাবস্ক্রিপশন
viewWillAppearস্ক্রিন প্রদর্শিত হওয়ার আগেডেটা আপডেট, নেভিগেশন বার লুকানো/দেখানো
viewDidAppearস্ক্রিন প্রদর্শিত হওয়ার পরঅ্যানিমেশন শুরু, বিশ্লেষণ, ক্যামেরা আপডেট
viewWillDisappearস্ক্রিন থেকে যাওয়ার আগেখসড়া সংরক্ষণ, বিজ্ঞপ্তি থেকে আনসাবস্ক্রাইব
viewDidDisappearস্ক্রিন থেকে যাওয়ার পরভারী প্রক্রিয়া বন্ধ, সম্পদ মুক্ত করা

স্ক্রিন প্রদর্শিত হলে কলের ক্রম

স্ক্রিনের প্রথম প্রদর্শনে ক্রম: init → loadView → viewDidLoad → viewWillAppear → viewDidAppear। পুনরায় প্রদর্শনে (অন্য স্ক্রিন থেকে ফিরে আসা): viewWillAppear → viewDidAppear। viewDidLoad কন্ট্রোলারের জীবনকালে শুধুমাত্র একবার কল হয়।

viewDidLoad, init এবং UI সেটআপ

viewDidLoad মেথড হল ইউজার ইন্টারফেস কনফিগার করার প্রধান বিন্দু। এটি view মেমরিতে লোড হওয়ার পরে কল হয়, যখন সমস্ত IBOutlet সংযোগ ইতিমধ্যে প্রতিষ্ঠিত হয়েছে। এখানে UI উপাদানগুলো প্রোগ্রামেটিকভাবে তৈরি করা হয়, constraints কনফিগার করা হয় এবং প্রাথমিক ডেটা লোড করা হয়।

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 তে, এই কোড View এর body এর সমতুল্য। কিন্তু UIViewController জীবনচক্র এবং অপ্টিমাইজেশনের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়। bindViewModel প্রতিক্রিয়াশীল সাবস্ক্রিপশনের জন্য Combine ব্যবহার করে — মডেল পরিবর্তন হলে ডেটা স্বয়ংক্রিয়ভাবে আপডেট হয়।

viewWillAppear এবং ডেটা আপডেট

viewWillAppear স্ক্রিন প্রদর্শিত হওয়ার আগে প্রতিবার কল হয়, এমনকি এটি ইতিমধ্যে মেমরিতে থাকলেও। এটি সেই ডেটা আপডেট করার জায়গা যা অন্য স্ক্রিনে পরিবর্তিত হতে পারে: তালিকা পুনরায় লোড করা, নোটিফিকেশন ব্যাজ আপডেট করা, নির্দিষ্ট স্ক্রিনের জন্য নেভিগেশন বার কনফিগার করা।

swift
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: UINavigationController এবং UITabBarController

Container View Controller হল একটি ViewController যা এক বা একাধিক চাইল্ড ViewController পরিচালনা করে। Apple তিনটি অন্তর্নির্মিত কন্টেইনার প্রদান করে: UINavigationController (স্ক্রিন স্ট্যাক), UITabBarController (ট্যাব), এবং UISplitViewController (iPad এর জন্য মাস্টার-ডিটেল)।

UINavigationController স্ট্যাকে স্থানান্তর সংগঠিত করে — push স্ক্রিন যোগ করে, pop সরিয়ে দেয়। UITabBarController অ্যাপ্লিকেশনের স্বাধীন বিভাগগুলির মধ্যে সুইচ করে। UISplitViewController iPad এ দুটি কন্ট্রোলার পাশাপাশি এবং iPhone এ একটি দেখায়। ডেভেলপার addChild এর মাধ্যমে কাস্টম কন্টেইনার তৈরি করতে পারে।

swift
// কাস্টম 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। ক্রম লঙ্ঘন মেমরি লিকের কারণ হয়।

MVVM এবং Coordinator এর মাধ্যমে Massive View Controller সমাধান

Massive View Controller সমস্যা ঘটে যখন UIViewController তে ব্যবসায়িক যুক্তি, নেটওয়ার্ক অনুরোধ, নেভিগেশন এবং UI কোডের শত শত লাইন থাকে। Apple সমস্যাটি স্বীকার করে এবং নেভিগেশন বের করার জন্য Coordinator এর সাথে MVVM (Model-View-ViewModel) সুপারিশ করে।

MVVM ব্যবসায়িক যুক্তি কন্ট্রোলার থেকে ViewModel এ স্থানান্তর করে। Controller শুধুমাত্র Combine বা ডেলিগেটের মাধ্যমে ViewModel কে View এর সাথে সংযুক্ত করে। Coordinator নেভিগেশন যুক্তি — কন্ট্রোলারগুলির মধ্যে তৈরি এবং স্থানান্তর — একটি পৃথক ক্লাসে বের করে। এই পদ্ধতি 2024 সাল থেকে Apple এর সেরা অনুশীলনে অন্তর্ভুক্ত হয়েছে।

swift
// 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: কখন কী বেছে নেবেন

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 + UIViewPreviewUIViewControllerRepresentable এর মাধ্যমে
CollectionViewUICollectionView + UICollectionViewLayoutLazyVGrid/LazyHGrid
iPad অভিযোজনUISplitViewController + UITraitCollectionNavigationSplitView + sizeClass
উন্নয়নের গতিধীর (ম্যানুয়াল লেআউট)দ্রুত (ঘোষণামূলক)

সচরাচর জিজ্ঞাসা

UIViewController কিভাবে UIView থেকে আলাদা?

UIViewController হল একটি কন্ট্রোলার যা স্ক্রিন এবং তার জীবনচক্র পরিচালনা করে। UIView হল একটি ভিউ যা বিষয়বস্তু প্রদর্শন করে। ViewController এ UIViews এর শ্রেণিবিন্যাস থাকে কিন্তু এটি নিজে একটি ভিজুয়াল উপাদান নয়। একটি কন্ট্রোলার একাধিক ভিউ পরিচালনা করে।

Massive View Controller কি?

Massive View Controller হল একটি অ্যান্টি-প্যাটার্ন যেখানে UIViewController তে অত্যধিক যুক্তি থাকে: ডেটা, নেভিগেশন, নেটওয়ার্ক অনুরোধ, অ্যানিমেশন। সমাধান — আলাদা সার্ভিস, কোঅর্ডিনেটর এবং ViewModel (MVVM) এ কোড বের করা।

ViewControllers এর মধ্যে ডেটা কীভাবে স্থানান্তর করবেন?

চারটি উপায়: prepare(for:sender:) (Segue) এ প্রপার্টির মাধ্যমে, ডেলিগেট (Delegate) এর মাধ্যমে, ক্লোজার (Closure) এর মাধ্যমে, শেয়ার্ড সার্ভিসের মাধ্যমে। শিথিল সংযোগের জন্য, Coordinator + Delegate বা Combine ব্যবহার করুন।

Container View Controller কি?

Container View Controller হল একটি কন্ট্রোলার যা চাইল্ড ViewController পরিচালনা করে। উদাহরণ: UINavigationController, UITabBarController, UISplitViewController। প্যারেন্ট কন্ট্রোলার addChild এর মাধ্যমে চাইল্ড যোগ করে, তাদের মধ্যে সুইচ করে এবং তাদের লেআউট পরিচালনা করে।

কখন SwiftUI View এর পরিবর্তে UIViewController ব্যবহার করবেন?

UIViewController — জটিল কাস্টম অ্যানিমেশন, ক্যামেরা কাজ, মানচিত্র, ভিডিও, কাস্টম লেআউট সহ UICollectionView এর জন্য। SwiftUI View — iOS 13+ এ মানক ইন্টারফেসের জন্য। UIHostingController এর মাধ্যমে সংযুক্ত করা গ্রহণযোগ্য।

সারাংশ

  • UIViewController — স্ক্রিন, UIView শ্রেণিবিন্যাস এবং জীবনচক্র পরিচালনার জন্য কেন্দ্রীয় UIKit ক্লাস
  • Lifecycle পাঁচটি মেথড নিয়ে গঠিত: viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear
  • viewDidLoad — প্রাথমিক UI সেটআপের বিন্দু, কন্ট্রোলারের জীবনকালে একবার কল হয়
  • viewWillAppear — প্রদর্শনের আগে প্রতিবার কল হয়, ডেটা আপডেট এবং নেভিগেশন বার কনফিগারেশনের জন্য উপযুক্ত
  • Container View Controller (UINavigationController, UITabBarController) চাইল্ড কন্ট্রোলারদের শ্রেণিবিন্যাস পরিচালনা করে
  • Massive View Controller MVVM (ViewModel এ যুক্তি বের করা) এবং Coordinator (নেভিগেশন বের করা) এর মাধ্যমে সমাধান করা হয়
  • UIViewController এবং SwiftUI হাইব্রিড অ্যাপ্লিকেশনের জন্য UIHostingController এবং UIViewRepresentable এর মাধ্যমে সংযুক্ত করা যেতে পারে

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন