ViewController Lifecycle হলো পদ্ধতিগুলোর একটি ক্রম যা UIKit iOS-এ স্ক্রিন পরিচালনা করার সময় স্বয়ংক্রিয়ভাবে কল করে। Apple ডকুমেন্টেশন অনুসারে, প্রতিটি UIViewController অবস্থার একটি পূর্বানুমানযোগ্য সেটের মধ্য দিয়ে যায়: View তৈরি থেকে তার আবির্ভাব এবং অন্তর্ধান পর্যন্ত। বোঝা এই পদ্ধতিগুলোর ক্রম এবং উদ্দেশ্য iOS অ্যাপের স্থিতিশীল কার্যক্রমের জন্য একটি আবশ্যক শর্ত।
মূল পয়েন্ট
ViewController Lifecycle হলো পদ্ধতিগুলোর একটি সেট যা UIViewController তার অস্তিত্ব জুড়ে UIKit থেকে গ্রহণ করে। iOS অ্যাপের প্রতিটি স্ক্রিন ক্রমান্বয়ে তৈরি, View লোডিং, স্ক্রিনে আবির্ভাব, অন্তর্ধান এবং মেমরি মুক্ত করার পর্যায়গুলোর মধ্য দিয়ে যায়। UIKit প্রতিটি পর্যায়ে সংশ্লিষ্ট পদ্ধতিগুলো স্বয়ংক্রিয়ভাবে কল করে এবং ডেভেলপার তার নিজস্ব যুক্তি যোগ করার জন্য সেগুলো ওভাররাইড করে।
UIViewController আর্কিটেকচার UIKit-এর ভিত্তি এবং SwiftUI যুগেও প্রাসঙ্গিক রয়ে গেছে — অনেক প্রজেক্ট এখনও ক্লাসিক পদ্ধতি বা হাইব্রিড আর্কিটেকচার ব্যবহার করে। Lifecycle বোঝা আপনাকে ভবিষ্যদ্বাণী করতে দেয় কখন subviews উপলব্ধ, কখন লেআউট পরিবর্তন করা নিরাপদ এবং স্ক্রিন আবির্ভূত বা অদৃশ্য হলে কোন অপারেশনগুলি সম্পাদন করতে হবে।
জীবনচক্রের প্রতিটি পদ্ধতির নির্দিষ্ট উদ্দেশ্য রয়েছে: কিছু কন্ট্রোলারের পুরো জীবনকালে একবার কল হয়, অন্যগুলো — প্রতিটি আবির্ভাব বা অন্তর্ধানে। পদ্ধতিগুলোর মধ্যে যুক্তি মেশানো দুষ্প্রাপ্য বাগ সৃষ্টি করে: মেমরি লিক, ভুল ডেটা আপডেট এবং অপ্রয়োজনীয় নেটওয়ার্ক অনুরোধ।
ছয়টি পদ্ধতি UIViewController-এর পূর্ণ জীবনচক্র গঠন করে। কল করার ক্রম স্থির এবং নেভিগেশন পদ্ধতির উপর নির্ভর করে না — push, present বা unwind segue সবই একই সময়সূচী অনুসরণ করে।
loadView চক্রের প্রথম পদ্ধতি, যা কল হয় যখন কন্ট্রোলারের View এখনও বিদ্যমান নেই। আপনি যদি Storyboard ব্যবহার করেন, UIKit স্বয়ংক্রিয়ভাবে xib ফাইল থেকে View লোড করে। প্রোগ্রামেটিকভাবে ইন্টারফেস তৈরি করার সময়, আপনি এই পদ্ধতি ওভাররাইড করে ম্যানুয়ালি মূল View নির্ধারণ করেন। বেশিরভাগ প্রজেক্টে, loadView স্পর্শ করা হয় না — কাজ viewDidLoad-এ করা হয়।
loadView ওভাররাইড করা শুধুমাত্র নির্দিষ্ট ক্ষেত্রে প্রয়োজন: যখন পুরো ইন্টারফেস Storyboard ছাড়া কোডে তৈরি করা হয়, অথবা যখন মূল View-কে অ-মানক শ্রেণীর হতে হয়। Apple ওভাররাইড করার সময় super.loadView না কল করার পরামর্শ দেয় — আপনি View তৈরি করার পূর্ণ দায়িত্ব গ্রহণ করেন।
override func loadView() {
view = UIView()
view.backgroundColor = .white
}
viewDidLoad চক্রের সবচেয়ে বেশি ব্যবহৃত পদ্ধতি। এটি View মেমরিতে লোড হওয়ার পরে একবার কল হয় তবে এখনও স্ক্রিনে প্রদর্শিত হয় না। এখানে subviews কনফিগার করা হয়, টেবিল ডেটা দিয়ে পূর্ণ করা হয়, সেল নিবন্ধন করা হয় এবং নোটিফিকেশনে সাবস্ক্রাইব করা হয় যা কন্ট্রোলারের পুরো জীবনকাল স্থায়ী হয়।
একটি গুরুত্বপূর্ণ বৈশিষ্ট্য: স্ক্রিন পুনরায় দেখালে viewDidLoad আবার কল হয় না। যদি আপনার প্রতি বারের স্ক্রিন আবির্ভাবে ডেটা আপডেট করার প্রয়োজন হয় — viewWillAppear ব্যবহার করুন। viewDidLoad-এ শুধুমাত্র এককালীন অপারেশন রাখুন যা মৌলিক কনফিগারেশনের জন্য প্রয়োজন।
viewWillAppear প্রতি বারে View ব্যবহারকারীর কাছে দৃশ্যমান হওয়ার ঠিক আগে কল হয়। এই পদ্ধতি একটি animated প্যারামিটার গ্রহণ করে যা নির্দেশ করে আবির্ভাবটি অ্যানিমেটেড কিনা। এখানে ডেটা আপডেট করা হয়, টেবিল রিলোড করা হয়, NavigationBar কনফিগার করা হয় এবং অ্যাপ্লিকেশনের অবস্থা অনুযায়ী উপাদান লুকানো বা দেখানো হয়।
স্ক্রিনের মধ্যে অবস্থা সিঙ্ক্রোনাইজেশন-এর জন্য viewWillAppear ব্যবহার করুন: যদি ব্যবহারকারী পূর্ববর্তী স্ক্রিনে ডেটা পরিবর্তন করতে পারে, এই পদ্ধতিটি ইন্টারফেস আপডেট করার সঠিক স্থান। viewWillAppear-এর প্রতিটি কল স্ক্রিন আবির্ভাবের পূর্বে ঘটে, চাইল্ড কন্ট্রোলার থেকে ফিরে আসার সময়ও।
viewDidAppear জানায় যে View স্ক্রিনে সম্পূর্ণরূপে আবির্ভূত হয়েছে এবং সমস্ত ট্রানজিশন অ্যানিমেশন শেষ হয়েছে। এই বিন্দুতে, স্ক্রিন ইন্টারঅ্যাকশনের জন্য প্রস্তুত — ব্যবহারকারী সম্পূর্ণ ইন্টারফেস দেখে এবং এর সাথে যোগাযোগ করতে পারে। এই পদ্ধতি সেই অ্যানিমেশন শুরু করার জন্য উপযুক্ত যা আবির্ভাবের পরে শুরু হওয়া উচিত, টাইমার শুরু করা এবং অ্যানালিটিক্স ইমপ্রেশন ট্র্যাক করা।
viewWillAppear-এর বিপরীতে, viewDidAppear গ্যারান্টি দেয় যে স্ক্রিন কেবল দৃশ্যমানই নয় বরং সম্পূর্ণ রেন্ডারও হয়েছে। আপনি যদি viewWillAppear-এ অ্যানিমেশন শুরু করেন, কিছু ফ্রেম এড়িয়ে যেতে পারে কারণ UIKit এখনও ট্রানজিশন সম্পূর্ণ করেনি। মসৃণ অ্যানিমেশনের জন্য, viewDidAppear ব্যবহার করুন।
viewWillDisappear স্ক্রিন থেকে View অদৃশ্য হওয়ার আগে কল হয় — অন্য কন্ট্রোলারে যাওয়ার সময়, মোডাল উইন্ডো বন্ধ করার সময় বা অ্যাপ সাসপেন্ড করার সময়। এটি অবস্থা সংরক্ষণ, নোটিফিকেশন থেকে সাবস্ক্রিপশন বাতিল, সক্রিয় প্রক্রিয়া বন্ধ এবং সেই সম্পদ মুক্ত করার সঠিক স্থান যা স্ক্রিন দৃশ্যমান না থাকলে প্রয়োজন নেই।
মনে রাখা গুরুত্বপূর্ণ: viewWillDisappear গ্যারান্টি দেয় না যে View শেষ পর্যন্ত অদৃশ্য হবে — ইশারা বাতিল হতে পারে। তাই, গুরুত্বপূর্ণ ডেটা viewDidDisappear-এও সংরক্ষণ করুন, যা প্রকৃত অদৃশ্য হওয়ার পরেই কল হয়।
viewDidDisappear আবির্ভাব এবং অদৃশ্য হওয়ার চক্র সম্পূর্ণ করে। এটি View স্ক্রিন থেকে লুকানোর পরে কল হয়। এই পদ্ধতিতে, অ্যানিমেশন শেষ পর্যন্ত বন্ধ করা হয়, অস্থায়ী অবজেক্ট সরানো হয় এবং viewWillDisappear-এ শুরু করা ডেটা সংরক্ষণ নিশ্চিত করা হয়।
এই পদ্ধতি কন্ট্রোলারের deinit-এর আগেও আসে — যদি আপনার UIViewController ধ্বংস হচ্ছে, deinit কল হওয়ার আগে viewDidDisappear হবে Lifecycle-এর শেষ পদ্ধতি। অবজেক্ট ধ্বংস হওয়ার আগে চূড়ান্ত পরিষ্কারের জন্য এটি ব্যবহার করুন।
কলের ক্রম নির্ভর করে স্ক্রিন কীভাবে আবির্ভূত হয়: প্রথমবার, ফিরে যাওয়ার সময়, বা মোডালি উপস্থাপন করার সময়। আসুন UIKit-এর দৃষ্টিকোণ থেকে তিনটি প্রধান দৃশ্যপট বিবেচনা করি।
যখন একটি স্ক্রিন প্রথমবার আবির্ভূত হয়, UIKit পূর্ণ সৃষ্টি চক্রের মধ্য দিয়ে যায়: loadView কল হয়, তারপর viewDidLoad, যার পরে আবির্ভাব অ্যানিমেশন শুরু হয়। অ্যানিমেশনের সময়, viewWillAppear কল হয়, এবং সম্পূর্ণ হওয়ার পরে — viewDidAppear। এটি একমাত্র দৃশ্যপট যেখানে loadView থেকে viewDidAppear পর্যন্ত সমস্ত পদ্ধতি ক্রমান্বয়ে সক্রিয় হয়।
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad — View মেমরিতে লোড হয়েছে")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("viewWillAppear — শীঘ্রই দেখা যাবে")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear — স্ক্রিন সম্পূর্ণ দৃশ্যমান")
}
যখন ব্যবহারকারী পূর্ববর্তী স্ক্রিনে ফিরে যায়, UIKit আবার viewDidLoad কল করে না — View ইতিমধ্যে মেমরিতে লোড। পরিবর্তে, ফিরে আসা স্ক্রিনে শুধুমাত্র viewWillAppear এবং viewDidAppear কল হয় এবং বর্তমান স্ক্রিনে — viewWillDisappear এবং viewDidDisappear। loadView এবং viewDidLoad বাদ দেওয়া হয় কারণ স্ক্রিন ইতিমধ্যে নেভিগেশন স্ট্যাকে বিদ্যমান।
মোডাল উপস্থাপনা একই নিয়ম অনুসরণ করে: নতুন কন্ট্রোলার প্রথম আবির্ভাবে পূর্ণ চক্রের মধ্য দিয়ে যায়, যখন বর্তমানটি viewWillDisappear এবং viewDidDisappear গ্রহণ করে। Dismiss-এ, ক্রম উল্টে যায়: ফিরে আসা কন্ট্রোলার আবার viewWillAppear এবং viewDidAppear পায়, যখন বাতিল করা কন্ট্রোলার চূড়ান্ত পদ্ধতি পায়। এই আচরণ UIKit-এ সমস্ত ট্রানজিশন প্রকারের জন্য অভিন্ন।
আসুন চারটি মূল দৃশ্যপট দেখি যেখানে Lifecycle বোঝা সরাসরি কোডের গুণমান এবং ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে। প্রতিটি দৃশ্যপটের জন্য, আমরা সুপারিশসহ একটি উদাহরণ প্রদান করি।
viewDidLoad প্রাথমিক সেটআপের স্থান যা স্ক্রিন দৃশ্যমানতার উপর নির্ভর করে না। এখানে collectionView কনফিগার করা হয়, কোষের জন্য nib ফাইল নিবন্ধন করা হয়, ডেটা উৎস এবং লেআউট তৈরি করা হয়। আপনি যদি নেটওয়ার্ক থেকে ডেটা লোড করেন, viewDidLoad-এ শুধুমাত্র অনুরোধ শুরু করা ভাল এবং UI আপডেট করুন viewWillAppear-এ যখন স্ক্রিন প্রদর্শনের জন্য প্রস্তুত।
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(
MyCell.self,
forCellReuseIdentifier: MyCell.identifier
)
viewModel.loadInitialData()
}
প্রতি বারে স্ক্রিন আবির্ভূত হওয়ার সময় ডেটা সিঙ্ক্রোনাইজেশনের জন্য viewWillAppear ব্যবহার করুন। উদাহরণস্বরূপ, যদি ব্যবহারকারী পূর্ববর্তী স্ক্রিনে সেটিংস পরিবর্তন করতে পারে, এখানে প্রদর্শিত মান আপডেট করা হয়, টেবিল রিলোড করা হয় এবং NavigationBar অবস্থা সামঞ্জস্য করা হয়। এটি গ্যারান্টি দেয় যে স্ক্রিন যেকোনো নেভিগেশন দৃশ্যপটে সর্বদা আপ-টু-ডেট ডেটা দেখায়।
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
navigationController?.setNavigationBarHidden(false, animated: animated)
}
viewDidAppear সেই অ্যানিমেশন শুরু করার জন্য আদর্শ যা ব্যবহারকারী স্ক্রিন দেখার পরে শুরু হওয়া উচিত। এখানে আপনি অ্যানালিটিক্স ইভেন্টও পাঠান: স্ক্রিন ভিউ, অনবোর্ডিং শুরু বা ভিডিও প্লেব্যাক শুরু। ট্রানজিশন সম্পূর্ণ হওয়ার আগে অ্যানিমেশন শুরু করলে জ্যাঁকি ইন্টারফেস হয় — UIKit-এর পর্যাপ্ত ফ্রেম প্রস্তুত করার সময় থাকে না।
viewWillDisappear-এ, খসড়া সংরক্ষণ করা হয়, টাইমার বন্ধ করা হয় এবং NotificationCenter থেকে সাবস্ক্রিপশন বাতিল করা হয়। এটি শেষ মুহূর্ত যখন স্ক্রিন এখনও দৃশ্যমান এবং ব্যবহারকারীর প্রসঙ্গ প্রয়োজন এমন অপারেশনের জন্য অ্যাক্সেসযোগ্য। গুরুত্বপূর্ণ ডেটার জন্য, অতিরিক্তভাবে viewDidDisappear ব্যবহার করুন বাতিল ইশারা থেকে সুরক্ষা হিসাবে।
জীবনচক্র পদ্ধতির ভুল ব্যবহার iOS অ্যাপে বাগের সবচেয়ে সাধারণ উৎসগুলোর একটি। আসুন UIViewController-এর সাথে কাজ করার বিভিন্ন পর্যায়ে ডেভেলপারদের সাধারণ ভুলগুলো দেখি।
প্রথম ভুল — Storyboard ব্যবহার করার সময় init বা loadView-এ subviews তৈরি করা। আপনি যদি Interface Builder ব্যবহার করেন, প্রয়োজন ছাড়া loadView ওভাররাইড করবেন না। Storyboard থাকাকালে loadView-এ View তৈরি করলে xib ফাইল উপেক্ষিত হয় এবং ফাঁকা স্ক্রিন পাওয়া যায়।
দ্বিতীয় ভুল — সাবস্ক্রিপশন বাতিল না করে viewDidLoad-ে কীবোর্ড নোটিফিকেশনে সাবস্ক্রাইব করা। আপনি যদি UIResponder.keyboardWillShowNotification-এ সাবস্ক্রাইব করেন কিন্তু স্ক্রিন লুকানোর সময় সাবস্ক্রিপশন বাতিল না করেন, ব্লকটি কন্ট্রোলারের deinit-এর পরেও কল হতে থাকবে — এটি মেমরি লিক যার ফলে অ্যাপ ক্র্যাশ হতে পারে।
তৃতীয় ভুল — স্ক্রিন আবির্ভূত হওয়ার আগে টাইমার এবং নেটওয়ার্ক অনুরোধ শুরু করা। যখন View এখনও দৃশ্যমান নয় তখন ছবি লোড করা বা অ্যানিমেশন করা সম্পদের অপচয়। ভিজ্যুয়াল আপডেট viewWillAppear বা viewDidAppear-এ সরান।
চতুর্থ ভুল — শুধুমাত্র viewWillDisappear-এ ডেটা সংরক্ষণ করা। ইন্টারঅ্যাকটিভ পপ ইশারার সাথে, ব্যবহারকারী সোয়াইপ শুরু করতে এবং বাতিল করতে পারে — পদ্ধতি কল হয়েছিল কিন্তু স্ক্রিন অদৃশ্য হয়নি। গুরুত্বপূর্ণ সংরক্ষণ viewDidDisappear বা applicationDidEnterBackground হ্যান্ডলারে ডুপ্লিকেট করুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
একবার — View মেমরিতে লোড হওয়ার পরে। স্ক্রিন পুনরায় আবির্ভূত হলে, viewDidLoad কল হয় না। যদি View পুনরায় তৈরি করার প্রয়োজন হয়, কন্ট্রোলারটি ধ্বংস এবং পুনরায় তৈরি করতে হবে।
জীবনচক্র সঠিকভাবে কাজ করার জন্য UIKit super.viewDidLoad কল করা আবশ্যক করে। এটি ছাড়া, লেআউট আপডেট এবং ট্রানজিশন পরিচালনায় সমস্যা হতে পারে। পদ্ধতির ভিতরে সর্বদা super-কে প্রথমে কল করুন।
সুপারিশ করা হয় না। যদি কন্ট্রোলার Storyboard থেকে আরম্ভ করা হয়, UIKit স্বয়ংক্রিয়ভাবে xib থেকে View লোড করে। loadView ওভাররাইড করা এই প্রক্রিয়া বাতিল করে এবং আপনার স্টোরিবোর্ড উপেক্ষিত হবে।
viewDidLoad বা viewWillAppear-এ সাবস্ক্রাইব করুন এবং viewWillDisappear বা viewDidDisappear-এ সাবস্ক্রিপশন বাতিল করুন, ক্লোজারের সাথে মেমরি লিক এড়াতে self-এর দুর্বল রেফারেন্স ব্যবহার করুন।
ফোর্স কুইট প্রক্রিয়াটি হঠাৎ বন্ধ করে দেয় — UIKit-এর Lifecycle পদ্ধতি কল করার সময় থাকে না। ডেটা সংরক্ষণের জন্য, AppDelegate-এ UIApplication.willTerminateNotification ব্যবহার করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন