আইওএস 5 এ কন্ট্রোলার কনটেইনমেন্টটি কীভাবে কাজ করে?


108

WWDC 2011 সেশন 102, অ্যাপল চালু দেখুন কন্ট্রোলার সংযত আচরণ, যা কাস্টম ভিউ নিয়ামক পাত্রে তৈরি করার ক্ষমতা, অনুরূপ UITabBarController, UINavigationControllerএবং মত।

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

পরিস্থিতি 1: কোনও পিতা-মাতার কাছ থেকে নতুন প্যারেন্ট ভিউ কন্ট্রোলারে সরানো

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

প্রদত্ত ক্রমে কি প্রথম দুটি লাইন ঘটতে হবে, বা সেগুলি বিপরীত করা যেতে পারে?

পরিস্থিতি 2: পিতা-মাতার ভিউ কন্ট্রোলার থেকে কোনও প্যারেন্ট ভিউ কন্ট্রোলারে সরানো

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

ফোন করাও কি দরকার [vc didMoveToParentViewController:nil]? ১০২ সেশনের উদাহরণগুলি এই দৃশ্যে এটি করেনি , তবে আমি জানি না যে এটি বাদ ছিল কিনা।

পরিস্থিতি 3: এক পিতামাতার ভিউ কন্ট্রোলার থেকে অন্যটিতে চলে যাওয়া

এটি সম্ভবত নিম্নলিখিত উপায়ে ঘটবে, কারণ প্রতিটি প্যারেন্ট ভিউ কন্ট্রোলারে যুক্তি সংযুক্ত করা হবে।

// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];

প্রশ্নাবলি

আমার মূল প্রশ্নটি হ'ল: সাধারণভাবে কন্ট্রোলার কনটেন্টটি কীভাবে কাজ করা উচিত? উপরে দেওয়া যান্ত্রিকগুলি কি সঠিক?

ফোন willMoveToParentViewControllerকরার আগে কি ফোন করা দরকার addChildViewController? এটি আমার কাছে যৌক্তিক আদেশের মতো মনে হচ্ছে তবে এটি কি কঠোরভাবে প্রয়োজনীয়?

ফোন করার didMoveToParentViewController:nilপরে কি ফোন করা দরকার removeFromParentViewController?

উত্তর:


72

UIViewControllerডক্স কখন এবং কল করার সময় না উপর প্রশংসনীয় স্পষ্ট willMove/ didMoveপদ্ধতি। পরীক্ষা করে দেখুন "একটি কনটেইনার দেখুন কন্ট্রোলার বাস্তবায়নকারী" ডকুমেন্টেশন।

দস্তাবেজগুলি বলছে যে আপনি যদি ওভাররাইড addChildViewControllerনা করেন তবে আপনাকে কল willMoveToParentViewController:পদ্ধতিতে কল করতে হবে না । তবে didMoveToParentViewController:রূপান্তরটি সম্পূর্ণ হওয়ার পরে আপনাকে পদ্ধতিটি কল করতে হবে না । "তেমনিভাবে, willMoveToParentViewController:পদ্ধতিটি কল করার আগে পদ্ধতিটিকে কল করা কনটেইনার ভিউ কন্ট্রোলারের দায়িত্ব removeFromParentViewControllerThe removeFromParentViewControllerপদ্ধতিটি didMoveToParentViewController:শিশু দর্শন নিয়ন্ত্রকের পদ্ধতিটিকে কল করে " "

এছাড়াও, এখানে কাজ করা উদাহরণ এবং নমুনা কোড এখানে রয়েছে

শুভকামনা


17
আমি দেখতে পাচ্ছি, তাই addChildViewControllerভারসাম্যপূর্ণ হওয়া উচিত didMoveToParentViewControllerএবং এর সাথে ভারসাম্য বজায় রাখা willMoveToParentViewControllerউচিত removeFromParentViewController। আমি ঠিক এটিই খুঁজছিলাম। ডক্সে কীভাবে আমি এটি মিস করেছি তা নিশ্চিত নয়।
গ্রেগরি হিগলে

কেন না? কেন আপনি উইলমোভটোপ্যারেন্টভিউ কনট্রোলারকে কল করতে হবে না তবে ডিমেমোটোপ্যারেন্টভিউ কনট্রোলারকে ফোন করতে হবে?
user4951

কারণ ডকসই এটাই বলে। অ্যাপল স্পষ্টতই অনুভব করে যে আমাদের জানার দরকার নেই।

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

2
এবং 'স্লাইড আউট' অ্যানিমেশন যেমন, শিশুটিকে সরিয়ে ফেলা হচ্ছে, অ্যানিমেশনটির শুরুতে আপনাকে ম্যানুয়ালি 'উইলমোভ' কল করতে হবে, কারণ আপনার শিশু ভিসির 'ভিউইলডিস্পায়ার' নামক কবে ফোন করবেন তা ইউিকিত অন্যথায় জানতে পারে না। এবং অ্যানিমেশনটির শেষে, আপনি যখন অপসারণফ্র্যাম্পেন্টভিউ কন্ট্রোলারকে কল করবেন তখন এটি আপনার জন্য স্বয়ংক্রিয়ভাবে 'ডডমভ' কল করতে পারে।
ক্রিস

23

এই অংশটি সঠিক নয়:

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

ডক্স অনুসারে:

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

সুতরাং আপনার [vc willMoveToParentViewController:self]কল করার দরকার নেই । আপনি কল করলে এটি স্বয়ংক্রিয়ভাবে সম্পন্ন হয় [self addChildViewController:vc]। এখানে আবার কোড নমুনা:

[self addChildViewController:vc];
// [vc willMoveToParentViewController:self] called automatically
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

দর্শন নিয়ন্ত্রকদের অপসারণ করার জন্য:

অপসারণের থেকে প্যারেন্টভিউ কনট্রোলার পদ্ধতিটি স্বয়ংক্রিয়ভাবে ডডমোভটোপ্যারেন্টভিউ কনট্রোলারকে কল করে: শিশুটিকে অপসারণের পরে চাইল্ড ভিউ কন্ট্রোলারের পদ্ধতি।

সম্ভবত এই কলটি [oldVC didMoveToParentViewController:nil]

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// [vc didMoveToParentViewController:nil] called automatically

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

দস্তাবেজগুলি didMoveToParentViewController " addChildViewController: পদ্ধতি" কল করার সাথে সাথে কল বলবে , আপনি কখন সন্তানের সংক্ষিপ্তসার যুক্ত করবেন তা নির্দিষ্ট করে না। আমি ভাবছি যদি সবাই এই ভুল পেয়ে থাকে। কিছু অ্যাপল ডক্সে কি এর উদাহরণ রয়েছে যা আমরা এটির বিরুদ্ধে পরীক্ষা করতে পারি?
রবার্ট

দ্রষ্টব্য: আপনি কি কল করার প্রয়োজনীয়তা willMoveToParentViewControllerপূর্বে addChildViewControllerযদি আপনি যে আইটেমটি সরিয়ে নিয়ে যাচ্ছি উপেক্ষিত সঙ্গে একটি কাস্টম ক্লাস হয় addChildViewController(যদি না আপনার ওভাররাইড এটা অভ্যন্তরীণভাবে কল)
bunkerdive
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.