মধ্যে পার্থক্য কি -[UIViewController viewWillAppear:]
এবং -[UIViewController viewDidAppear:]
?
মধ্যে পার্থক্য কি -[UIViewController viewWillAppear:]
এবং -[UIViewController viewDidAppear:]
?
উত্তর:
সাধারণভাবে, আমি এটিই করি:
1) ViewDidLoad - যখনই আমি দৃশ্যের সাথে একসাথে উপস্থিত হওয়া উচিত এমন একটি দৃশ্যে নিয়ন্ত্রণগুলি যুক্ত করছি, ঠিক এখনই, আমি এটিকে ভিউডিডলড পদ্ধতিতে রেখেছি। মূলত এই পদ্ধতিকে বলা হয় যখনই ভিউ মেমরির মধ্যে লোড করা হত। সুতরাং উদাহরণস্বরূপ, যদি আমার ভিউটি 3 টি লেবেলযুক্ত একটি ফর্ম হয় তবে আমি এখানে লেবেলগুলি যুক্ত করব; এই রূপগুলি ছাড়া দর্শনটির অস্তিত্ব কখনও থাকবে না।
২) ভিউউইল অ্যাপয়ার : আমি সাধারণত ফর্মের ডেটা আপডেট করার জন্য ভিউউইলঅ্যাপিয়ার ব্যবহার করি। সুতরাং, উপরের উদাহরণের জন্য, আমি প্রকৃতপক্ষে আমার ডোমেন থেকে ডেটা ফর্মটিতে লোড করতে এটি ব্যবহার করব। ইউআইভিউউজগুলি তৈরি করা ব্যয়বহুল, এবং আপনার ভিউউইল অ্যাপয়ার পদ্ধতিতে যতটা সম্ভব সম্ভব এড়ানো উচিত, যখন এটি কল করা হবে, কারণ এটির অর্থ আইফোন ইতিমধ্যে ইউআইভিউ ব্যবহারকারীকে দেখানোর জন্য প্রস্তুত এবং আপনি এখানে কিছু ভারী কিছু করেন না খুব দৃশ্যমান উপায়ে পারফরম্যান্সকে প্রভাবিত করবে (যেমন অ্যানিমেশনগুলি বিলম্বিত হওয়া ইত্যাদি)।
৩) ভিউডিডঅ্যাপার : পরিশেষে, আমি এমন জিনিসগুলিতে নতুন থ্রেডগুলি শুরু করতে ভিউডিড অ্যাপ্লিকেশনটি ব্যবহার করি যা কার্যকর করতে অনেক বেশি সময় লাগে, যেমন উদাহরণস্বরূপ উপরের ফর্মটির জন্য অতিরিক্ত ডেটা পাওয়ার জন্য একটি ওয়েবসার্ভিস কল করা ভাল thing ইতিমধ্যে বিদ্যমান এবং ব্যবহারকারীর কাছে প্রদর্শিত হচ্ছে, আপনি ডেটা পাওয়ার সময় ব্যবহারকারীকে একটি দুর্দান্ত "অপেক্ষা" বার্তা প্রদর্শন করতে পারেন।
viewWillAppear
? আপনি নেটওয়ার্ক মাধ্যমে ডাউনলোড মানে? তবে আপনি কি ডাউনলোড স্টাফগুলিতে পরামর্শ দিচ্ছেন viewDidAppear
?
ViewDidAppear
ব্যবহারকারীরা সহজেই ইউআই সম্পর্কে বিভ্রান্ত করতে পারেন :)
ভিউডিডলড === >>> আপনার আরম্ভের কোডটি এখানে রাখুন। ডায়নামিক ডেটা রাখবেন না যা ভিউ লাইফাইকেলের সময় পরিবর্তিত হতে পারে। সুতরাং, যদি আপনি মূল ডেটা থেকে ডেটা টানছেন তবে আপনি এখানে এটি করতে চান না যদি এই দৃশ্যটির জীবনকালে পরিবর্তন হতে পারে। উদাহরণস্বরূপ: বলুন আপনার কাছে একটি ট্যাব নিয়ামক রয়েছে। আপনি ট্যাব 1 থেকে ট্যাব 2 এ স্যুইচ করুন এবং ট্যাব 2-তে মডেলটিতে কিছু পরিবর্তন করুন। আপনি যদি ট্যাব 1 এ ফিরে এসে থাকেন এবং আপনার মডেল কোডটি ভিডলিডে করা হয়ে থাকে তবে এটি আপডেট করা হবে না (ধরে নেওয়া যাক আপনি কেভিও বা এনএসফ্যাচডেরাল্টস কন্ট্রোলার ইত্যাদি ব্যবহার করছেন না)।
ভিউউইল অ্যাপয়ার === >>> ভিউটি ইতিমধ্যে স্মৃতিতে রয়েছে কিনা তা এই বার দেখা হয় the আপনার গতিশীল কোডটি এখানে রাখুন, যেমন মডেল যুক্তি।
ভিউডিডঅ্যাপার === >>> ব্যয়বহুল ক্রিয়াকলাপগুলি এখানে রাখুন যা আপনি কেবল তখনই করতে চান যদি আপনি নিশ্চিত হন যে দৃশ্যটি অনস্ক্রিন, যেমন নেটওয়ার্ক কল।
বিজ্ঞপ্তি: যদি আপনার অ্যাপ্লিকেশন ব্যাকগ্রাউন্ড হয় এবং অগ্রভাগে ফিরে আসে আপনার এনএসএনটিফিকেশন সেন্টার ব্যবহার করে এটি পরিচালনা করতে হবে need আমি নীচের মন্তব্যে এর জন্য কোড লিখেছিলাম। আপনি ভাবতে পারেন ভিউউইল অ্যাপ্লিকেশন / ভিউডিড অ্যাপ্লিকেশনটি আগুন জ্বলবে। সেখানে একটি বিরতি পয়েন্ট রাখুন এবং এটি পরীক্ষা করুন। আগুন লাগে না। সুতরাং, আপনার অ্যাপ্লিকেশনের ব্যাকগ্রাউন্ডে থাকা অবস্থায় যদি কিছু পরিবর্তিত হয় তবে আপনাকে বিজ্ঞপ্তিগুলি ব্যবহার করে আপডেট করতে হবে।
viewWillAppear
পদ্ধতি প্রকৃত দৃশ্য লোড আগে বলা হয়।
viewDidAppear
যখন দৃশ্য ইতিমধ্যে লোড হয় পদ্ধতি বলা হয়, তারপর তোমাকে কিছু দেখাতে চাই।
কয়েকটি পর্যবেক্ষণ:
viewDidLoad
যখন দৃশ্য প্রথম instantiated হয় পদ্ধতি বলা হয়। IBOutlet
রেফারেন্সগুলি বলা হয়ে যাওয়ার আগেই ডেকে আনা হয়েছিল, তবে এর আগে নয়। frame
দেখুন যদিও, সময় বলা হয়েছে কর্তৃক প্রতিষ্ঠিত হতে পারে না। সাবভিউ এবং তাদের সম্পর্কিত সীমাবদ্ধতাগুলি যুক্ত / কনফিগার করার জন্য এটি দুর্দান্ত জায়গা। তবে যদি আপনি frame
মূল দর্শনের মাত্রাগুলির ভিত্তিতে মানগুলির কোনও ম্যানুয়াল কনফিগারেশন করছেন তবে এই ফ্রেমের কনফিগারেশনটি মুলতুবি করা উচিত viewWillAppear
বা না হওয়া পর্যন্ত viewDidLayoutSubviews
।
viewWillAppear
পদ্ধতি নামক যখন দৃশ্য শ্রেণীবিন্যাসে দেখুন উপস্থাপনা শুরু সম্পর্কে হয়। উল্লেখযোগ্যভাবে, এটিকে দর্শনের উপস্থাপনাটির অ্যানিমেশন (যদি থাকে তবে) এর শুরুতে বলা হয়। viewWillDisappear
এই দর্শন থেকে দূরে রূপান্তর শুরু হওয়ার সাথে সাথে এর সহযোগী বলা হয় obvious
viewDidAppear
যখন দৃশ্য উপস্থাপনা সম্পন্ন করা হয় পদ্ধতি বলা হয়, উল্লেখযোগ্য হল যখন যেকোন এবং সমস্ত যুক্ত অ্যানিমেশন সমাপ্ত হয়েছে। viewDidDisappear
এই দর্শন থেকে দূরে রূপান্তরটি সম্পন্ন করা হলে এর সহযোগী স্পষ্টতই ডাকা হয়।
দুটি গুরুত্বপূর্ণ সতর্কতা:
viewDidLoad
একবার এবং একবার একবার বলা হয়, যখন দৃশ্যটি প্রথম ইনস্ট্যান্ট হয়। অন্যদিকে, viewWillAppear
এবং viewDidAppear
যখন দৃশ্যটি প্রথম উপস্থাপন করা হবে কেবল তখনই তাকে ডাকা হবে না, তবে পরবর্তী সময়ে প্রত্যেকবার একই দৃষ্টিতে পুনরায় উপস্থাপন করা হবে। উদাহরণস্বরূপ, আপনি যখন প্রথম কোনও দৃশ্য উপস্থাপন করবেন তখন এই তিনটি পদ্ধতিই কল করা হবে। যদি পরবর্তীতে প্রশ্নের মধ্যে থাকা ভিউটি অন্য একটি উপস্থাপনা উপস্থাপন করে যা পরবর্তীতে খারিজ করা হয়, viewWillAppear
এবং viewDidAppear
যখন প্রশ্নটিতে দেখা ভিউটি হায়ারার্কিতে আবার যুক্ত হয়ে অ্যানিমেটেড করা হয় এবং সাধারণত তা আবার বলা viewDidLoad
হবে , তবে তা হবে না। viewDidLoad
শুধুমাত্র যখন এই নির্দিষ্ট উদাহরণটি তৈরি করা হয় তখনই ডাকা হয়।
সুতরাং, আপনি যদি প্রতিবার কোনও দৃশ্য পুনর্বার উপস্থিত হয় এমন কিছু করতে চান (যেমন আপনি বরখাস্ত করেন বা এটিতে ফিরে যান), এটিতে viewWillAppear
বা এটিকে করুন viewDidAppear
। আপনি যদি চান যে এটি কেবল তখনই ঘটে যখন ভিউটি প্রথম তাত্ক্ষণিকভাবে শুরু হয়, এটি এটিকে করুন viewDidLoad
।
কলিং viewWillAppear
গ্যারান্টি দেয় না যে সেই দৃশ্যে রূপান্তরটি কখনই সম্পন্ন হবে। উল্লেখযোগ্যভাবে, আপনি যদি ইন্টারেক্টিভ ট্রানজিশন ব্যবহার করেন যা রিয়েল-টাইম ব্যবহারকারী ইনপুট দ্বারা চালিত হয় তবে সেই ইন্টারেক্টিভ ট্রানজিশনটি বাতিল করা যেতে পারে। অর্থাৎ, কেবল কারণ viewWillAppear
হিসাবে বলা হয়, এর অর্থ এই নয় যে কল viewDidAppear
হবে। সাধারণত এটি হয়, তবে ইন্টারেক্টিভ অঙ্গভঙ্গিটি যদি বাতিল হয়ে যায় তবে তা হবে না (কারণ রূপান্তর কখনও শেষ হয়নি)।
ডাব্লুডাব্লুডিসি 2013 তে, ইন্টারেক্টিভ ট্রানজিশনের প্রসঙ্গে একজন উপস্থাপক কৌতুক করেছিলেন যে তাদের নাম viewWillAppear
" viewMightAppear
, বা viewWillProbablyAppear
, বা iReallyWishThisViewWouldAppear
" রাখা উচিত।
একটি অন্তর্নির্মিত ইন্টারেক্টিভ অঙ্গভঙ্গির উদাহরণ হ'ল UINavigationController
একটি পপ শুরু করতে যখন আপনি এবং "বাম প্রান্ত থেকে সোয়াইপ" ব্যবহার করেন। viewWillAppear
দৃশ্য যা আপনি পপিং জন্য বলা হবে, কিন্তু যদি আপনি যে, "বাম প্রান্ত থেকে সোয়াইপ" বাতিল দৃশ্য যেখান থেকে আপনি এই পপ অঙ্গভঙ্গি শুরু ফিরতে, পপ বাতিল করা হয়েছে এবং viewDidAppear
দেখার জন্য আপনাকে শুরু পপ পিছনে কখনই ডাকা হবে না।
এর নেট এফেক্টটি হ'ল আপনার সতর্কতা অবলম্বন করা উচিত যে আপনি কোডটি না লিখেছেন যা ধরে নিয়েছে যে প্রতিটি কলই viewWillAppear
শেষ পর্যন্ত একটি কল অনুসরণ করবে viewDidAppear
। যদি রূপান্তর বাতিল হয়ে যায়, তবে এটি হবে না।
1) ভিউউইল অ্যাপয়ার : ভিউ কন্ট্রোলারে একবার ডাকা এবং তার ফ্রেমটি দেখতে মেমরিটিতে আসলে দৃশ্যটি লোড হয়, তবে এখনও ব্যবহারকারীর কাছে উপস্থিত হয় নি
২) ভিউডিডঅ্যাপার : নিয়ামকটি ভিউ হায়ারার্কিতে যুক্ত হয়েছে, যাতে আপনি পরবর্তী কন্ট্রোলারের কাছেও উপস্থাপন করতে পারেন, ভিউটি সংক্ষিপ্তসারগুলি দেখায়
পূর্ববর্তীটি দৃশ্যটি প্রদর্শিত হওয়ার আগে ঘটে এবং এরপরেরটি পরে ঘটে।
সংক্ষেপে:
-ভিউউইল অ্যাপয়ার -> ডেটা আপডেট করুন (একটি টেবিলের ভিউ থেকে ডেটা পুনরায় লোড করুন)
-ভিউডিডঅ্যাপার -> ব্যয়বহুল ক্রিয়াকলাপ (একটি দুর্দান্ত অগ্রগতির সাথে এপিআই কল!)
ইউসকেস , অর্থাত্ আমার কখন ব্যবহার করা উচিত?
viewDidLoad
- যখন লেবেল, বোতামগুলি (আই, এবং কোনও নিয়ন্ত্রণ / সাবভিউ) ভিউয়ের ইন্টারফেস ফাইলের সাথে সংযুক্ত থাকে এবং আপনি যদি এই সমস্ত কিছু ভিউকন্ট্রোলারের ভিউ হিসাবে একই সময়ে লোড করতে চান এবং আপনি যদি একবারে মেমরিতে লোড করতে চান এবং হন এটি দিয়ে সম্পন্ন
viewWillAppear
- বলুন, আপনি ভিউকন্ট্রোলারটি স্ক্রিনে প্রদর্শিত হওয়ার সাথে সাথে দৃশ্যের পটভূমির রঙ পরিবর্তন করতে চান। অথবা আরও বাস্তবসম্মতভাবে যদি আপনি দিনের রাতের সময়ে ডার্কমোড ব্যাকগ্রাউন্ড রঙ এবং দিনের বেলা পটভূমি দেখার হালকা রঙ চান তবে এই কোডটিতে যানviewWillAppear
এখানে আরেকটি ভাল ইউজকেস https://stackoverflow.com/a/39395865/5438240
এছাড়াও মনে রাখবেন, যদি আপনি একটি ন্যাভিগেশন স্ট্যাক (ব্যবহার করছেন UINavigationController
), viewController যে সম্পর্কে popped করা হয়েছে viewWillDisappear()
বলা হয়, এবং ViewController আগামী স্ট্যাকের উপর হতে হবে হবে viewWillAppear()
নামক