ইউআইভিউকন্ট্রোলার ভিডডিলোড বনাম ভিউউইল অ্যাপয়ার: শ্রমের যথাযথ বিভাগ কী?


164

একটি সাবক্লাসে viewDidLoadবনাম viewWillAppear: যে কাজগুলি অর্পণ করা উচিত সে সম্পর্কে আমি সর্বদা কিছুটা অস্পষ্ট ছিলাম UIViewController

উদাহরণস্বরূপ আমি এমন একটি অ্যাপ্লিকেশন করছি যেখানে আমার একটি UIViewControllerসাবক্লাস রয়েছে যাতে একটি সার্ভার হিট হয়, ডেটা পাওয়া যায়, একটি ভিউতে এটি খাওয়ানো হয় এবং তারপরে সেই দৃশ্যটি প্রদর্শিত হয়। অনুকূল এবং এই কাজ করার কনস কি কি viewDidLoadবনাম viewWillAppear?

উত্তর:


251

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

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


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

7
ভিউডিডলড কেবল তখনই ডাকা হয় যখন ভিউটি নির্মাণ করা হয় - সুতরাং উদাহরণস্বরূপ যখন কোনও ভিউ কন্ট্রোলার ইনফরমনিবনেড কল করার পরে ভিউটি অ্যাক্সেস করা হয় তখন। ভিউউইল অ্যাপয়ারকে যে কোনও সময় বলা হয় আপনার ভিউ কন্ট্রোলারটি দেখা না হলেও দেখাতে আসত - সুতরাং যখন আপনার ভিউ কন্ট্রোলারটিকে ধাক্কা দেওয়া হয়, তখন ভিউ উইল অ্যাপয়ার কল হয়। আপনি যদি সেখান থেকে অন্য একটি মতামত চাপুন, এবং ব্যবহারকারী ফিরে আসে, ভিউউইলঅ্যাপিয়ারটিকে আবার কল করা হবে।
কেন্ডাল হেলস্টেটার জেলনার

ধন্যবাদ কেন্ডাল ইয়াহ, কয়েকটি কৌশলগতভাবে এনএসএলগ আমাকে বাছাই করেছে। ভিউউইনএলপায়ার / ভিউউইলডিস্পায়ার আগুন ভিউকন্ট্রোলার পুশ / পপগুলিতে।
দুগলা

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

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

12

প্রথমদিকে কেবল টেবিল ভিউ সহ ভিউডিডলড ব্যবহৃত হয়। ওয়াইফাই-র ক্ষতির সাথে পরীক্ষা করার সময়, বিমান মোডে ডিভাইস সেট করে, বুঝতে পেরেছিল যে টেবিলটি ওয়াইফাই ফেরার সাথে রিফ্রেশ হয়নি। প্রকৃতপক্ষে, ডিভাইসে টেবিল ভিউটি রিফ্রেশ করার কোনও উপায় নেই বলে মনে হয়, এমনকি ইন-ইন.ফো.লিস্টে ইয়েস সেট করে ব্যাকগ্রাউন্ড মোড সহ হোম বোতামটি চাপ দিয়ে।

আমার সমাধান:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

10

এটি লক্ষ করা গুরুত্বপূর্ণ যে অবস্থানের জন্য ভিউডিডলড ব্যবহার করা কিছুটা ঝুঁকিপূর্ণ এবং সীমানা নির্ধারণ না করায় এড়ানো উচিত। এটি অপ্রত্যাশিত ফলাফলের কারণ হতে পারে (আমার কাছে বিভিন্ন ইস্যু ছিল ...)

এই পোস্টটি বিভিন্নভাবে বিভিন্ন পদ্ধতি এবং সেগুলির প্রতিটিটিতে কী ঘটে তা বেশ ভালভাবে বর্ণনা করে।

বর্তমানে এককালীন আরম্ভের জন্য এবং অবস্থানের জন্য আমি একটি পতাকা সহ ভিউডিডঅ্যাপার ব্যবহার করার কথা ভাবছি, যদি কারও অন্য কোনও প্রস্তাব থাকে তবে দয়া করে আমাকে জানান।


এর সাথে একমত: "... যেহেতু সীমানা সেট করা হয়নি ... এড়ানো উচিত ..."
ড্যানিসুপ্র

4

নির্ভর করে, প্রতিবার যখন ভিউটি খুলবেন তখন কি আপনার ডেটা লোড করার দরকার আছে ? নাকি শুধু একবার ?

এখানে চিত্র বর্ণনা লিখুন

  • লাল: প্রতিবার তাদের পরিবর্তন করার দরকার নেই। তারা বোঝা হয়ে গেলে তারা যেমন ছিল তেমন থাকে।
  • বেগুনি: সময়ের সাথে সাথে আপনি প্রতিটি বার লোড করার পরে তাদের পরিবর্তন করা দরকার। আপনি একই 3 টি প্রস্তাবিত ব্যবহারকারীকে অনুসরণ করতে দেখতে চান না, আপনি যখন আবার স্ক্রিনে ফিরে আসবেন তখনই এটি পুনরায় লোড করা দরকার। তাদের ফটোগুলি আপডেট হতে পারে ... আপনি 5 বছর আগের কোনও ছবি দেখতে চান না ...

viewDidLoad:আপনার যে যা প্রসেসিং আছে তা একবার করা দরকার।
viewWilLAppear:পৃষ্ঠাটি লোড হওয়ার সাথে সাথে যে কোনও প্রসেসিংয়ে পরিবর্তন হওয়া দরকার।

লেবেল, আইকন, বোতাম শিরোনাম বা সর্বাধিক ডেটা ইনপুটডবিডাইভোপার সাধারণত পরিবর্তন হয় না। নাম, ফটো, লিঙ্ক, বোতামের স্থিতি, তালিকাগুলি (আপনার টেবিলভিউ বা সংগ্রহের ভিউয়ের জন্য ইনপুট অ্যারে) বা বেশিরভাগ ডেটা ইনপুটডবাইউসার সাধারণত পরিবর্তন করে।


বেগুনিটি ভিউতে ডেকে আনা হবেদেব অ্যাপ্লিকেশনটি ভিউ অ্যাপ্লায়ার নয়
অ্যালেক্স কর্নহাউজার

@ অ্যালেক্সকর্নহাউসার আপনার অর্থ কি এটি বলা হবে? আমি আপনার মধ্যে বলছি viewWillAppearআপনি ল্যাটস টুইটগুলি জিজ্ঞাসা করতে এবং পরীক্ষা করতে পারেন। viewDidAppearতার জন্য খুব দেরী
মধু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.