-ভিউউইলঅ্যাপিয়ার: এবং -ভিউডিডঅ্যাপার:? এর মধ্যে পার্থক্য কী?


131

মধ্যে পার্থক্য কি -[UIViewController viewWillAppear:]এবং -[UIViewController viewDidAppear:]?


1
ধন্যবাদ বোল্টক্লক, তবে দয়া করে যদি সম্ভব হয় তবে উভয়ের উদাহরণ দিন ..
পিজেআর

3
@ বল্টক্লকটি যদি সত্যি হয় তবে এটি ভাল লাগবে। আমি অনুমান করছি যে 15 জন যারা পদ্ধতিটির নামটি পড়াতে উত্সাহ দিয়েছিল কিন্তু বাস্তবে এটি কখনও মাপা যায় নি ... গুগল থেকে এখানে এসেছিল কারণ এটি তাদের মধ্যে পার্থক্য নয়
আদম

1
সুনির্দিষ্টভাবে: প্যারেন্টভিউ.ভিউডিডিঅ্যাপারকে একটি দীর্ঘ সময় বলা হয় অ্যাপল আসলে প্যারেন্ট ভিউ প্রদর্শন করার আগে ... অ্যাপল প্রথমে (পরমাণুগতভাবে) সমস্ত সংক্ষিপ্ত চিত্র আঁক ... এবং যদি আপনার অনেকগুলি সংক্ষিপ্ত চিত্র বা জটিল থাকে তবে "ভিউডিডঅ্যাপিয়ার" দশকে বলা যেতে পারে বা শত শত মিলিসেকেন্ড খুব শীঘ্রই :(।
আদম

উত্তর:


292

সাধারণভাবে, আমি এটিই করি:

1) ViewDidLoad - যখনই আমি দৃশ্যের সাথে একসাথে উপস্থিত হওয়া উচিত এমন একটি দৃশ্যে নিয়ন্ত্রণগুলি যুক্ত করছি, ঠিক এখনই, আমি এটিকে ভিউডিডলড পদ্ধতিতে রেখেছি। মূলত এই পদ্ধতিকে বলা হয় যখনই ভিউ মেমরির মধ্যে লোড করা হত। সুতরাং উদাহরণস্বরূপ, যদি আমার ভিউটি 3 টি লেবেলযুক্ত একটি ফর্ম হয় তবে আমি এখানে লেবেলগুলি যুক্ত করব; এই রূপগুলি ছাড়া দর্শনটির অস্তিত্ব কখনও থাকবে না।

২) ভিউউইল অ্যাপয়ার : আমি সাধারণত ফর্মের ডেটা আপডেট করার জন্য ভিউউইলঅ্যাপিয়ার ব্যবহার করি। সুতরাং, উপরের উদাহরণের জন্য, আমি প্রকৃতপক্ষে আমার ডোমেন থেকে ডেটা ফর্মটিতে লোড করতে এটি ব্যবহার করব। ইউআইভিউউজগুলি তৈরি করা ব্যয়বহুল, এবং আপনার ভিউউইল অ্যাপয়ার পদ্ধতিতে যতটা সম্ভব সম্ভব এড়ানো উচিত, যখন এটি কল করা হবে, কারণ এটির অর্থ আইফোন ইতিমধ্যে ইউআইভিউ ব্যবহারকারীকে দেখানোর জন্য প্রস্তুত এবং আপনি এখানে কিছু ভারী কিছু করেন না খুব দৃশ্যমান উপায়ে পারফরম্যান্সকে প্রভাবিত করবে (যেমন অ্যানিমেশনগুলি বিলম্বিত হওয়া ইত্যাদি)।

৩) ভিউডিডঅ্যাপার : পরিশেষে, আমি এমন জিনিসগুলিতে নতুন থ্রেডগুলি শুরু করতে ভিউডিড অ্যাপ্লিকেশনটি ব্যবহার করি যা কার্যকর করতে অনেক বেশি সময় লাগে, যেমন উদাহরণস্বরূপ উপরের ফর্মটির জন্য অতিরিক্ত ডেটা পাওয়ার জন্য একটি ওয়েবসার্ভিস কল করা ভাল thing ইতিমধ্যে বিদ্যমান এবং ব্যবহারকারীর কাছে প্রদর্শিত হচ্ছে, আপনি ডেটা পাওয়ার সময় ব্যবহারকারীকে একটি দুর্দান্ত "অপেক্ষা" বার্তা প্রদর্শন করতে পারেন।


4
দুঃখিত, তবে "আমার ডোমেন থেকে ডেটা ফর্মটিতে লোড করুন" বলতে আপনার কী বোঝানো হয়েছে viewWillAppear? আপনি নেটওয়ার্ক মাধ্যমে ডাউনলোড মানে? তবে আপনি কি ডাউনলোড স্টাফগুলিতে পরামর্শ দিচ্ছেন viewDidAppear?
ফিলিপ 007

1
@ Philip007 আমি মনে করি স্ট্যাক ডোমেইন এই ধরনের উল্লেখ করা হয়: en.wikipedia.org/wiki/Domain-specific_modeling । ডেটা আপনার মডেল বা অনুরূপ থেকে লোড করা হয়।
দেন্টার্গ

2
এই উত্তরটি ডক্সে থাকা উচিত। এটি তিনটি পদ্ধতির মধ্যে পার্থক্য পরিষ্কার করতে সত্যিই সহায়ক ছিল। ধন্যবাদ!
গ্যাংস্টাগ্রাহাম

1
+1 আমি এই তিনজনের মধ্যে পার্থক্য বুঝতে পেরে কিছুটা বিভ্রান্তি বোধ করছিলাম, তবে আপনি কেবল এটি পুরোপুরিভাবে ছাড়িয়েছেন
@ চেটান

@ চেতানভালারা তবে আপনি দীর্ঘক্ষণ কাজ চালিয়ে গেলে ViewDidAppearব্যবহারকারীরা সহজেই ইউআই সম্পর্কে বিভ্রান্ত করতে পারেন :)
এইচটিএইচটি

46

ভিউডিডলড === >>> আপনার আরম্ভের কোডটি এখানে রাখুন। ডায়নামিক ডেটা রাখবেন না যা ভিউ লাইফাইকেলের সময় পরিবর্তিত হতে পারে। সুতরাং, যদি আপনি মূল ডেটা থেকে ডেটা টানছেন তবে আপনি এখানে এটি করতে চান না যদি এই দৃশ্যটির জীবনকালে পরিবর্তন হতে পারে। উদাহরণস্বরূপ: বলুন আপনার কাছে একটি ট্যাব নিয়ামক রয়েছে। আপনি ট্যাব 1 থেকে ট্যাব 2 এ স্যুইচ করুন এবং ট্যাব 2-তে মডেলটিতে কিছু পরিবর্তন করুন। আপনি যদি ট্যাব 1 এ ফিরে এসে থাকেন এবং আপনার মডেল কোডটি ভিডলিডে করা হয়ে থাকে তবে এটি আপডেট করা হবে না (ধরে নেওয়া যাক আপনি কেভিও বা এনএসফ্যাচডেরাল্টস কন্ট্রোলার ইত্যাদি ব্যবহার করছেন না)।

ভিউউইল অ্যাপয়ার === >>> ভিউটি ইতিমধ্যে স্মৃতিতে রয়েছে কিনা তা এই বার দেখা হয় the আপনার গতিশীল কোডটি এখানে রাখুন, যেমন মডেল যুক্তি।

ভিউডিডঅ্যাপার === >>> ব্যয়বহুল ক্রিয়াকলাপগুলি এখানে রাখুন যা আপনি কেবল তখনই করতে চান যদি আপনি নিশ্চিত হন যে দৃশ্যটি অনস্ক্রিন, যেমন নেটওয়ার্ক কল।

বিজ্ঞপ্তি: যদি আপনার অ্যাপ্লিকেশন ব্যাকগ্রাউন্ড হয় এবং অগ্রভাগে ফিরে আসে আপনার এনএসএনটিফিকেশন সেন্টার ব্যবহার করে এটি পরিচালনা করতে হবে need আমি নীচের মন্তব্যে এর জন্য কোড লিখেছিলাম। আপনি ভাবতে পারেন ভিউউইল অ্যাপ্লিকেশন / ভিউডিড অ্যাপ্লিকেশনটি আগুন জ্বলবে। সেখানে একটি বিরতি পয়েন্ট রাখুন এবং এটি পরীক্ষা করুন। আগুন লাগে না। সুতরাং, আপনার অ্যাপ্লিকেশনের ব্যাকগ্রাউন্ডে থাকা অবস্থায় যদি কিছু পরিবর্তিত হয় তবে আপনাকে বিজ্ঞপ্তিগুলি ব্যবহার করে আপডেট করতে হবে।


1
আপনি যখন অ্যাপ্লিকেশনটি সর্বনিম্ন করবেন তখন কি ভিউউইল বা ভিউডিড চালিত হবে?
জিফ

2
@ জিফ এটি একটি দুর্দান্ত প্রশ্ন। ব্যাকগ্রাউন্ডে থাকা অবস্থায় সিস্টেম বা ব্যবহারকারীর দ্বারা অ্যাপ্লিকেশনটিকে হত্যা না করা ছাড়া কোনওটিই চালিত হয় না। আন-মিনিমিমাইজ করা অ্যাপ্লিকেশনটি আপনাকে অবহিত করার জন্য যা করতে হবে তা হল ইউআইএপ্লিকেশনভিলইন্টারফোরগ্রাউন্ডনোটিকেশন নামের জন্য আপনাকে এনএসএনটিফিকেশন সেন্টার এবং অ্যাডঅবার্সার ব্যবহার করতে হবে। নির্বাচকটি অ্যাপ্লিকেশনউইলএন্টারফোরগ্রাউন্ড হওয়া উচিত: এটিতে একটি এনএসএনটিফিকেশন প্যারামিটার রয়েছে। ডেটা ইত্যাদি পুনরায় লোড করার জন্য আপনার কোডটি সেই পদ্ধতিতে রাখুন you আপনি যা করতে পারেন তা হ'ল আপনি যে পদ্ধতিটিকে কল করেন তার পুনরায় লোড পদ্ধতি তৈরি করুন এবং সেগুলির একই হওয়ার দরকার হলে ডিড অ্যাপও দেখুন।
হাসিবোট

2
@ জিফ এর মতো কিছু: - (অকার্যকর) ভিউডিডলড {[[এনএসএনটিফিকেশনকেন্দ্র ডিফল্টকেন্দ্র] অ্যাডঅবার্সার: স্ব নির্বাচক: @ নির্বাচনকারী (অ্যাপ্লিকেশনউইলইন্টারফোরগ্রাউন্ড :) নাম: ইউআইএপ্লিকেশনওয়িলইনটারফোরগ্রাউন্ড নোটিকেশন অবজেক্ট: নীল]; } - (অকার্যকর) অ্যাপ্লিকেশন উইলএন্টারফোরগ্রাউন্ড: (এনএসনিটিফিকেশন *) বিজ্ঞপ্তি {// যাই হোক না কেন এখানে সাড়া দিন}
হাস্যবোট

12

viewWillAppearপদ্ধতি প্রকৃত দৃশ্য লোড আগে বলা হয়।

viewDidAppearযখন দৃশ্য ইতিমধ্যে লোড হয় পদ্ধতি বলা হয়, তারপর তোমাকে কিছু দেখাতে চাই।


9

viewWillAppear:
■ সামনে দৃশ্য জানালা 'দৃশ্য অনুক্রমের যোগ করা হয় বলা
■ আগে [vc.view layoutSubviews] বলা (প্রয়োজন হলে)
viewDidAppear :
■ পর দৃশ্য দৃশ্য অনুক্রমের যোগ করা হয় বলা
■ [vc.view layoutSubviews] পরে বলা (যদি প্রয়োজন হয় তাহলে)


7

কয়েকটি পর্যবেক্ষণ:

  • 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। যদি রূপান্তর বাতিল হয়ে যায়, তবে এটি হবে না।


5

ভিউউইলপিয়ার ভিউ লোড করার আগে কল করবে যাতে আপনি দৃশ্যটি লোড করার আগে নির্দিষ্ট কাজটি করতে পারেন এবং ভিউডিডিঅ্যাপার ভিউ লোড করার পরে কল করবে যাতে পোস্ট টাস্কটি সেই পদ্ধতিতে সম্পন্ন হবে


4

"উইল" এবং "ডিড" এর মধ্যে পার্থক্য ... নাম অনুসারে ভিউটি দেখা যাওয়ার আগে ভিউ উইল অ্যাপয়ারকে ডাকা হবে এবং ভিউ উপস্থিত হওয়ার সাথে সাথে ভিডডিয়ায়য়ার কল করা হবে।


গৃহীত উত্তর ব্রোতে দেখুন, যার মধ্যে 70+ টি আপভেট রয়েছে। :)
পিজেআর

4

1) ভিউউইল অ্যাপয়ার : ভিউ কন্ট্রোলারে একবার ডাকা এবং তার ফ্রেমটি দেখতে মেমরিটিতে আসলে দৃশ্যটি লোড হয়, তবে এখনও ব্যবহারকারীর কাছে উপস্থিত হয় নি

২) ভিউডিডঅ্যাপার : নিয়ামকটি ভিউ হায়ারার্কিতে যুক্ত হয়েছে, যাতে আপনি পরবর্তী কন্ট্রোলারের কাছেও উপস্থাপন করতে পারেন, ভিউটি সংক্ষিপ্তসারগুলি দেখায়



3

সংক্ষেপে:

-ভিউউইল অ্যাপয়ার -> ডেটা আপডেট করুন (একটি টেবিলের ভিউ থেকে ডেটা পুনরায় লোড করুন)

-ভিউডিডঅ্যাপার -> ব্যয়বহুল ক্রিয়াকলাপ (একটি দুর্দান্ত অগ্রগতির সাথে এপিআই কল!)


1

নামটি ইঙ্গিত দেয় যে viewWillAppearভিউটি হাজির হওয়ার আগেই ডাকা হয় এবং viewDidAppearযখন ভিউ উপস্থিত হয় তখন ডাকা হয়।


0

ইউসকেস , অর্থাত্ আমার কখন ব্যবহার করা উচিত?

viewDidLoad - যখন লেবেল, বোতামগুলি (আই, এবং কোনও নিয়ন্ত্রণ / সাবভিউ) ভিউয়ের ইন্টারফেস ফাইলের সাথে সংযুক্ত থাকে এবং আপনি যদি এই সমস্ত কিছু ভিউকন্ট্রোলারের ভিউ হিসাবে একই সময়ে লোড করতে চান এবং আপনি যদি একবারে মেমরিতে লোড করতে চান এবং হন এটি দিয়ে সম্পন্ন

viewWillAppear- বলুন, আপনি ভিউকন্ট্রোলারটি স্ক্রিনে প্রদর্শিত হওয়ার সাথে সাথে দৃশ্যের পটভূমির রঙ পরিবর্তন করতে চান। অথবা আরও বাস্তবসম্মতভাবে যদি আপনি দিনের রাতের সময়ে ডার্কমোড ব্যাকগ্রাউন্ড রঙ এবং দিনের বেলা পটভূমি দেখার হালকা রঙ চান তবে এই কোডটিতে যানviewWillAppear

এখানে আরেকটি ভাল ইউজকেস https://stackoverflow.com/a/39395865/5438240

এছাড়াও মনে রাখবেন, যদি আপনি একটি ন্যাভিগেশন স্ট্যাক (ব্যবহার করছেন UINavigationController), viewController যে সম্পর্কে popped করা হয়েছে viewWillDisappear()বলা হয়, এবং ViewController আগামী স্ট্যাকের উপর হতে হবে হবে viewWillAppear()নামক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.