viewWillAppear হল একটি UIViewController পদ্ধতি যা UIKit প্রতিবার কল করে যখন একটি স্ক্রিন ব্যবহারকারীর কাছে দৃশ্যমান হওয়ার আগে। Apple ডেভেলপার ডকুমেন্টেশন অনুসারে, এই পদ্ধতি একটি বুলিয়ান প্যারামিটার animated গ্রহণ করে যা নির্দেশ করে যে ট্রানজিশনটি অ্যানিমেশন সহ ঘটে কিনা। viewWillAppear হল ডেটা আপডেট এবং স্ক্রিনের অবস্থা সিঙ্ক্রোনাইজ করার প্রধান স্থান।
মূল পয়েন্ট
viewWillAppear হল একটি UIViewController পদ্ধতি যা UIKit উইন্ডো হায়ারার্কিতে View যোগ করার আগে অবিলম্বে কল করে। এই মুহুর্তে, View-এর Auto Layout পাসের পরে চূড়ান্ত মাত্রা রয়েছে, কিন্তু এটি এখনও ব্যবহারকারীর কাছে দৃশ্যমান নয় — ট্রানজিশন অ্যানিমেশন হয় শুরু হয়নি বা চলছে। ডেভেলপার এই পদ্ধতিটি ওভাররাইড করে স্ক্রিনের প্রতিটি প্রদর্শনের আগে যে অপারেশনগুলি করা উচিত সেগুলি সম্পাদন করতে।
viewDidLoad-এর বিপরীতে যা শুধুমাত্র একবার ট্রিগার হয়, viewWillAppear প্রতিবার কল করা হয় যখন স্ক্রিন প্রদর্শিত হতে চলেছে: প্রাথমিক খোলার সময়, চাইল্ড কন্ট্রোলার থেকে ফিরে আসার সময়, মডাল উইন্ডো বন্ধ করার পরে এবং TabBar ট্যাব সুইচ করার সময়। এটি এটিকে আপ-টু-ডেট ইন্টারফেস অবস্থা বজায় রাখার জন্য একটি মূল পদ্ধতি করে তোলে।
পদ্ধতিটি Bool টাইপের একটি animated প্যারামিটার গ্রহণ করে, যা true হয় যদি স্ক্রিনের প্রদর্শন অ্যানিমেশন সহ হয়। এই প্যারামিটারটি NavigationBar এবং TabBar পদ্ধতিতে পাস করা সুবিধাজনক, যার সামঞ্জস্যপূর্ণ আচরণের জন্য অনুরূপ প্যারামিটার রয়েছে।
viewWillAppear কলের সময় নেভিগেশন প্রকারের উপর নির্ভর করে, তবে সাধারণ নিয়ম অপরিবর্তিত থাকে: পদ্ধতিটি View দৃশ্যমান হওয়ার আগে ট্রিগার হয়। আসুন মূল পরিস্থিতিগুলি বিবেচনা করি।
viewDidLoad-এর পরে, UIKit প্রদর্শনের প্রস্তুতি শুরু করে: View হায়ারার্কিতে যোগ করা হয়, layout পাস ট্রিগার করা হয়, এবং ট্রানজিশন অ্যানিমেশন শুরু হওয়ার আগে অবিলম্বে, viewWillAppear কল করা হয়। এই মুহুর্তে, স্ক্রিন এখনও দৃশ্যমান নয়, তবে সমস্ত সাবভিউ-এর সঠিক আকার রয়েছে এবং তাদের বিষয়বস্তু নিরাপদে আপডেট করা যেতে পারে।
যখন ব্যবহারকারী ব্যাক বাটন টিপে বা প্রোগ্রামেটিকভাবে popViewController কল করে, UIKit পূর্ববর্তী স্ক্রিনে ফিরে আসে এবং তার viewWillAppear কল করে। এটি viewWillAppear ব্যবহারের মূল পরিস্থিতি — একটি আইটেম যোগ করার পরে তালিকা আপডেট করা বা সেটিংস সিঙ্ক্রোনাইজ করা।
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
updateBadgeCount()
}
মডালি উপস্থাপিত কন্ট্রোলার বন্ধ করার পরে, UIKit সেই কন্ট্রোলারে viewWillAppear কল করে যা এটি উপস্থাপন করেছিল। এই পরিস্থিতি বিশেষ মনোযোগ প্রয়োজন যদি আপনি ডেটা ফেরত পাঠাতে ডেলিগেট বা ক্লোজার ব্যবহার করেন — viewWillAppear নিশ্চিত করে যে ফলাফল পাওয়ার পরে স্ক্রিন আপডেট হবে।
TabBarController প্রতিবার সুইচ করার সময় নির্বাচিত ট্যাবের কন্ট্রোলারে viewWillAppear কল করে। যদি ট্যাব গতিশীল ডেটা প্রদর্শন করে — বিনিময় হার, বিজ্ঞপ্তি, ব্যবহারকারীর অবস্থা — viewWillAppear সেগুলি আপডেট করার জন্য আদর্শ স্থান।
viewWillAppear বেশ কয়েকটি নির্দিষ্ট কাজ সমাধান করে যা অন্যান্য পদ্ধতিতে করা অসম্ভব বা অনুপযুক্ত। আসুন মূল কাজগুলি দেখি।
viewWillAppear-এর সবচেয়ে সাধারণ ব্যবহার হল স্ক্রিনের প্রতিবার প্রদর্শনে একটি UITableView বা UICollectionView পুনরায় লোড করা। যদি পূর্ববর্তী স্ক্রিনে ডেটা পরিবর্তিত হয়ে থাকে (আইটেম যোগ হয়েছে, অবস্থা পরিবর্তিত হয়েছে), viewWillAppear-এ reloadData কল করা নিশ্চিত করে যে ব্যবহারকারী আপডেট তথ্য দেখে।
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
viewModel.synchronize()
tableView.reloadData()
}
viewWillAppear-এ NavigationBar-এর চেহারা কনফিগার করা সুবিধাজনক: এটি লুকানো বা দেখানো, এর রঙ পরিবর্তন করা, বড় শিরোনাম সেট করা। যদি বিভিন্ন স্ক্রিনে NavigationBar-এর বিভিন্ন শৈলী থাকে, তাহলে viewWillAppear এই পরিবর্তনগুলির জন্য সঠিক স্থান, কারণ viewDidLoad শুধুমাত্র একবার কল করা হয়।
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(
false, animated: animated
)
navigationController?.navigationBar.prefersLargeTitles = true
tabBarController?.tabBar.isHidden = false
}
যে বিজ্ঞপ্তিগুলি শুধুমাত্র তখনই অর্থপূর্ণ যখন স্ক্রিন দৃশ্যমান — কীবোর্ড বিজ্ঞপ্তি, বিষয়বস্তু পরিবর্তন বিজ্ঞপ্তি — viewWillAppear-এ সাবস্ক্রাইব করা হয় এবং viewDidDisappear-ে আনসাবস্ক্রাইব করা হয়। এটি স্ক্রিন সক্রিয় না থাকলে অপ্রয়োজনীয় হ্যান্ডলার প্রতিরোধ করে এবং মেমরি লিক থেকে রক্ষা করে।
যদি স্ক্রিন অ্যাপ দ্বারা লুকানো বা ছোট করা যায়, তাহলে viewWillAppear UI অবস্থা পুনরুদ্ধারের জন্য একটি সুবিধাজনক স্থান: সেগমেন্ট সুইচ করা, স্ক্রোল অবস্থান পুনরুদ্ধার করা, অস্থায়ী পরিবর্তন রিসেট করা। ব্যবহারকারী প্রতিবার প্রদর্শনে স্ক্রিনটি একটি পূর্বানুমানযোগ্য অবস্থায় পান।
অপঠিত বার্তা, রেটিং বা বিজ্ঞপ্তির কাউন্টার প্রদর্শনকারী স্ক্রিনে, viewWillAppear সেগুলি আপডেট করার সঠিক স্থান। যদি ব্যবহারকারী অন্য স্ক্রিনে পরিমাণ পরিবর্তন করতে পারে, তাহলে এখানে পুনঃগণনা এবং UITabBarItem.badgeValue বা কাস্টম সূচক আপডেট করা হয়। এটি নিশ্চিত করে যে ব্যবহারকারী সর্বদা বর্তমান সংখ্যা দেখে, সে অন্য স্ক্রিনে কতক্ষণ ছিল তা নির্বিশেষে।
collectionView-এর সাথে কাজ করার ক্ষেত্রে বিশেষ মনোযোগ দেওয়া উচিত: যদি স্ক্রিনে ডেটা কাউন্টার বা অবস্থা সহ কোষের গ্রিড হিসাবে উপস্থাপিত হয়, তাহলে viewWillAppear-এ তাদের আপডেট নির্বাচনমূলক হওয়া উচিত। সম্পূর্ণ reloadData-এর পরিবর্তে, দৃশ্যমান কোষের জন্য reloadItemsAtIndexPaths ব্যবহার করুন যাতে ঝিলিক এবং স্ক্রোল অবস্থান হারানো এড়ানো যায়।
viewWillAppear এবং viewDidLoad-এর মধ্যে পার্থক্য বোঝা সঠিক UIViewController আর্কিটেকচারের ভিত্তি। এই পদ্ধতিগুলির কল ফ্রিকোয়েন্সি, প্রসঙ্গ এবং উদ্দেশ্য আলাদা।
viewDidLoad একবার কল করা হয় এবং এমন কনফিগারেশনের জন্য উপযুক্ত যা সময়ের সাথে পরিবর্তিত হয় না: কোষ নিবন্ধন করা, ডেলিগেট সেট করা, ধ্রুবক আরম্ভ করা। viewWillAppear প্রতিটি প্রদর্শনে কল করা হয় এবং এমন অপারেশনের জন্য উপযুক্ত যা পুনরাবৃত্তি করতে হবে: ডেটা আপডেট করা, দৃশ্যমান উপাদান কনফিগার করা, অবস্থা সিঙ্ক্রোনাইজ করা।
| বৈশিষ্ট্য | viewDidLoad | viewWillAppear |
|---|---|---|
| ফ্রিকোয়েন্সি | একবার | প্রতিবার প্রদর্শনে |
| View দৃশ্যমান | না | না (শীঘ্রই দৃশ্যমান হবে) |
| View মাত্রা | চূড়ান্ত নয় | চূড়ান্ত |
| উপযুক্ত | একবারের সেটআপ | আপডেট এবং সিঙ্ক্রোনাইজেশন |
| অ্যানিমেশন | প্রযোজ্য নয় | animated প্যারামিটার |
সোনালী নিয়ম: যদি একটি অপারেশন শুধুমাত্র একবার সম্পাদন করা উচিত — এটি viewDidLoad-এ রাখুন। যদি প্রতিবার স্ক্রিনে ফিরে আসার সময় সম্পাদন করা উচিত — এটি viewWillAppear-এ রাখুন।
ভুল ব্যবহার viewWillAppear-এর কার্যকারিতা সমস্যা, অতিরিক্ত আপডেট এবং অসামঞ্জস্যপূর্ণ ইন্টারফেস অবস্থার কারণ হতে পারে। আসুন সবচেয়ে সাধারণ ভুলগুলি দেখি।
প্রথম ভুল — viewDidLoad-এর লজিকের নকল। যদি আপনি viewDidLoad এবং viewWillAppear উভয়েই টেবিল কোষ নিবন্ধন করেন, তাহলে নিবন্ধন একাধিকবার সম্পাদিত হবে, যদিও একবারের সেটআপ যথেষ্ট। সমস্ত একবারের কনফিগারেশন viewDidLoad-এ সরান।
দ্বিতীয় ভুল — প্রতিটি প্রদর্শনে শর্তহীন reloadData। যদি ডেটা পরিবর্তিত না হয়, তাহলে টেবিল পুনরায় লোড করা ডেটা সোর্সে অপ্রয়োজনীয় কোয়েরি এবং কোষ পুনরায় অঙ্কন ঘটায়, যা কার্যকারিতা হ্রাস করে। reloadData কল করার আগে পরীক্ষা করুন যে অবস্থা সত্যিই পরিবর্তিত হয়েছে কিনা।
তৃতীয় ভুল — অনুরোধ সম্পূর্ণ হওয়ার আগে স্ক্রিন আবার লুকানো হতে পারে তা বিবেচনা না করে নেটওয়ার্ক অনুরোধ নিয়ে কাজ করা। যদি আপনি viewWillAppear-এ URLSession অনুরোধ শুরু করেন এবং ব্যবহারকারী অবিলম্বে অন্য স্ক্রিনে চলে যায়, তাহলে ফলাফল ইতিমধ্যে লুকানো View-এ প্রয়োগ হতে পারে। আপডেট করার আগে বাতিলযোগ্য কাজ ব্যবহার করুন বা isViewLoaded এবং window পরীক্ষা করুন।
চতুর্থ ভুল — super কল করতে ভুলে যাওয়া। super.viewWillAppear কল না করা প্যারেন্ট কন্ট্রোলারের (UINavigationController, UITabBarController) আচরণ ভঙ্গ করতে পারে এবং জেসচার ও ট্রানজিশনের ভুল হ্যান্ডলিংয়ের কারণ হতে পারে। super সর্বদা কল করা উচিত।
পঞ্চম ভুল — layoutIfNeeded কল না করে constraints পরিবর্তন করা। যদি আপনি viewWillAppear-এ প্রোগ্রামেটিকভাবে constraints পরিবর্তন করেন, UIKit সেগুলি তাৎক্ষণিকভাবে প্রয়োগ করে না — পরিবর্তনগুলি পরবর্তী layout পাস পর্যন্ত জমা হয়। constraints পরিবর্তনের পরে পরিবর্তনগুলির তাৎক্ষণিক প্রয়োগের জন্য, view.layoutIfNeeded() কল করুন। এটি বিশেষ করে বিষয়বস্তু-নির্ভর উপাদানের উচ্চতা সামঞ্জস্য করার সময় গুরুত্বপূর্ণ।
ষষ্ঠ ভুল — viewWillAppear-এ অ্যানিমেশন সম্পাদনের চেষ্টা। উপরে উল্লিখিত হিসাবে, UIKit এখনও ট্রানজিশন অ্যানিমেশন প্রক্রিয়া করছে, এবং আপনার অ্যানিমেশন সিস্টেম অ্যানিমেশনের সাথে প্রতিদ্বন্দ্বিতা করতে পারে। যদি আপনার একটি উপাদানকে প্রভাব সহ প্রদর্শিত করার প্রয়োজন হয়, তাহলে viewDidAppear-এ ইনকামিং অ্যানিমেশন ব্যবহার করুন, এবং viewWillAppear-এ শুধুমাত্র প্রাথমিক অবস্থা কনফিগার করুন: স্বচ্ছতা 0, স্কেল 0.8-এ transform, ইত্যাদি।
সপ্তম ভুল — animated প্যারামিটার উপেক্ষা করা। কিছু ডেভেলপার viewWillAppear-এ animated মান পরীক্ষা করে না এবং এমন অপারেশন করে যা অ্যানিমেশনের উপস্থিতির উপর নির্ভর করা উচিত। উদাহরণস্বরূপ, NavigationBar animated = false হলে অ্যানিমেশন ছাড়া লুকানো যেতে পারে, এবং animated = true হলে — অ্যানিমেশন সহ, যাতে ট্রানজিশন মসৃণ দেখায়। সর্বদা animated প্যারামিটার উপযুক্ত UIKit পদ্ধতিতে পাস করুন।
অষ্টম ভুল — স্ক্রিন দৃশ্যমান না থাকলে UI পরিবর্তন করা। যদি আপনি viewWillAppear-এ একটি নেটওয়ার্ক অনুরোধ শুরু করেন এবং এর completion block UI আপডেট করে যখন স্ক্রিন ইতিমধ্যে অদৃশ্য হয়ে গেছে, ব্যবহারকারী ঝিলিক বা অসামঞ্জস্যপূর্ণ অবস্থা দেখতে পাবেন। ক্লোজারে UI আপডেট করার আগে সর্বদা isViewLoaded এবং window পরীক্ষা করুন। এই সহজ পদক্ষেপটি ক্র্যাশ এবং অপ্রয়োজনীয় ইন্টারফেস পুনঃঅঙ্কন প্রতিরোধ করে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
viewWillAppear প্রদর্শন অ্যানিমেশন শুরু হওয়ার আগে কল করা হয়, যখন View এখনও দৃশ্যমান নয়। viewDidAppear অ্যানিমেশন সম্পূর্ণ হওয়ার পরে কল করা হয়, যখন স্ক্রিন সম্পূর্ণরূপে প্রদর্শিত হয় এবং মিথস্ক্রিয়ার জন্য উপলব্ধ হয়।
সাধারণ অবস্থায়, স্ক্রিন প্রদর্শিত হলে viewWillAppear সর্বদা কল হয়। ব্যতিক্রম হল অ্যাপের ফোর্স কুইট, যেখানে UIKit-এর Lifecycle পদ্ধতি কল করার সময় থাকে না।
হ্যাঁ, অবশ্যই। UIKit এই কলটি UINavigationController এবং UITabBarController-এর সাথে অভ্যন্তরীণ সমন্বয়ের জন্য ব্যবহার করে। super ছাড়া, জেসচার এবং ট্রানজিশন অ্যানিমেশন ভেঙে যেতে পারে।
প্রত্যেক ট্যাব পরিবর্তনে। UIKit নির্বাচিত ট্যাবের কন্ট্রোলারে viewWillAppear কল করে যত তাড়াতাড়ি ব্যবহারকারী TabBar-এ সংশ্লিষ্ট আইকনে ট্যাপ করে।
কন্ট্রোলার বৈশিষ্ট্য বা শেয়ার্ড ডেটা সোর্স ব্যবহার করুন। popViewController কল করার আগে, পূর্ববর্তী কন্ট্রোলারে প্রয়োজনীয় মান সেট করুন, এবং সেগুলি তার viewWillAppear-এ ইতিমধ্যে উপলব্ধ হবে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন