অ্যাডচিল্ডভিউ কনট্রোলার আসলে কী করে?


102

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

অ্যাপল ডকুমেন্টেশনের নির্দেশাবলী অনুসারে, আমি addChildViewControllerযখনই আমার ধারকটিতে শিশু ভিউ কন্ট্রোলার যুক্ত করি তখনই আমি কল করি। বর্তমান চাইল্ড ভিউ কন্ট্রোলারটি অদলবদলের জন্য আমার কোডটি দেখতে এমন SideBarViewControllerদেখাচ্ছে:

- (void)showViewController:(UIViewController *)newViewController {
    UIViewController* oldViewController = [self.childViewControllers 
                                           objectAtIndex:0];
    
    [oldViewController removeFromParentViewController];
    [oldViewController.view removeFromSuperview];
    
    newViewController.view.frame = CGRectMake(
        0, 0, self.view.frame.size.width, self.view.frame.size.height
    );
    [self addChildViewController: newViewController];
    [self.view addSubview: newViewController.view];
}

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

আসলে, যদি আমি আমার কোডটি কল না করার জন্য আবার লিখি addChildViewController, এবং পরিবর্তে এটি দেখতে ...

- (void)showViewController:(UIViewController *)newViewController {

    // Get the current child from a member variable of `SideBarViewController`
    UIViewController* oldViewController = currentChildViewController;

    [oldViewController.view removeFromSuperview];

    newViewController.view.frame = CGRectMake(
        0, 0, self.view.frame.size.width, self.view.frame.size.height
    );
    [self.view addSubview: newViewController.view];

    currentChildViewController = newViewController;
}

... তাহলে আমার অ্যাপটি এখনও পুরোপুরি কাজ করে, যতদূর আমি বলতে পারি!

অ্যাপল ডকুমেন্টেশনগুলি কী করবে addChildViewControllerবা কেন আমাদের এটি কল করার কথা রয়েছে সে সম্পর্কে খুব বেশি আলোকপাত হয় না। UIViewControllerক্লাস রেফারেন্সে পদ্ধতিটি কীভাবে বা এটি ব্যবহার করা উচিত তার প্রাসঙ্গিক বিবরণের পুরো পরিমাণটি বর্তমানে:

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

একই পৃষ্ঠাতে এই অনুচ্ছেদটি আগেও রয়েছে:

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

এখানে কল করার জন্য আপনার প্রয়োজনীয় প্রয়োজনীয় পদ্ধতিগুলি রয়েছে:

অ্যাডচিল্ডভিউ কনট্রোলার:
সরানফ্র্যাম্পেন্টভিউ
কনট্রোলার উইলমোভটো প্যারেন্টভিউ কনট্রোলার:
ডডমোভটোপ্যারেন্টভিউ কনট্রোলার:

তবে এটি 'ইভেন্টস' বা 'প্রত্যাশিত কনটেন্ট আচরণ' কী বলছে বা কেন (বা এমনকি যখন) এই পদ্ধতিগুলি কল করা 'অপরিহার্য' সে সম্পর্কে কোনও ধারণা দেয় না।

অ্যাপল ডকুমেন্টেশনের "কাস্টম কনটেইনার ভিউ কন্ট্রোলারগুলি" বিভাগে কাস্টম কনটেইনার ভিউ কন্ট্রোলারের উদাহরণগুলি এই পদ্ধতিটিকে কল করে, তাই আমি ধরে নিই যে এটি কেবলমাত্র শিশু ভিউকন্ট্রোলারকে একটি অ্যারেতে পপ করার বাইরে কিছু গুরুত্বপূর্ণ উদ্দেশ্যে কাজ করে তবে আমি বুঝতে পারি না যে উদ্দেশ্য কি আউট। এই পদ্ধতিটি কী করে এবং আমি কেন এটি কল করব?


3
অ্যাপল এর 2011 ডাব্লুডাব্লুডিসি ভিডিও পৃষ্ঠাতে এই বিষয়ে একটি দুর্দান্ত সেশন রয়েছে ("ইউআইভিউউকন্ট্রোলার কনটেন্টমেন্ট প্রয়োগকরণ")।
অ্যালাদিনিয়

উত্তর:


94

আমিও এই প্রশ্নটি নিয়ে ভাবছিলাম। আমি ডাব্লুডাব্লুডিসি ২০১১ ভিডিওর সেশন ১০২ দেখেছি এবং ব্রুস ডি নীলো মিঃ ভিউ কন্ট্রোলার এটি বলেছেন:

viewWillAppear:, viewDidAppear:ইত্যাদির সাথে কিছু করার নেই addChildViewController:। যা addChildViewController:কিছু করা হয় তা বলতে হয় "এই ভিউ কন্ট্রোলার সেই একজনের সন্তান" এবং দেখার চেহারার সাথে এর কোনও যোগসূত্র নেই। যখন তাদের কল করা হয় তখন যখন উইন্ডো হায়ারার্কি থেকে ভিউগুলি সরানো হয় এবং এর সাথে যুক্ত হয়।

সুতরাং মনে হচ্ছে কলটি addChildViewController:খুব কম করে। কল এর পার্শ্ব প্রতিক্রিয়াগুলি গুরুত্বপূর্ণ অংশ। তারা সম্পর্ক parentViewControllerএবং childViewControllersসম্পর্ক থেকে আসে । আমি জানি এমন কয়েকটি পার্শ্ব প্রতিক্রিয়া এখানে দেওয়া হল:

  • শিশু দেখার নিয়ন্ত্রকদের কাছে উপস্থিতির পদ্ধতি ফরোয়ার্ড করা
  • রোটেশন পদ্ধতি ফরোয়ার্ড করা হচ্ছে
  • (সম্ভবত) ফরওয়ার্ডিং মেমরি সতর্কতা
  • অসামঞ্জস্য ভিসি শ্রেণিবিন্যাস এড়ানো, বিশেষত transitionFromViewController:toViewController:…যেখানে উভয় ভিসির একই পিতা বা মাতা থাকা দরকার
  • কাস্টম ধারক দর্শন নিয়ন্ত্রকদের রাষ্ট্র সংরক্ষণ এবং পুনরুদ্ধারে অংশ নিতে মঞ্জুরি দেওয়া হচ্ছে
  • প্রতিক্রিয়াশীল চেইনে অংশ নিচ্ছেন
  • আপ hooking navigationController, tabBarControllerইত্যাদি বৈশিষ্ট্য

এটি সেশনটি 102 নয় 101
শানচেনস

প্রতিক্রিয়াশীল চেইনের জন্য +1। আপনি যদি কোনও শিশু ইউআইভিউকন্ট্রোলারের মালিকানাধীন একটি সংক্ষিপ্তসারটিতে স্পর্শ ইভেন্টগুলি পেতে চান তবে অ্যাডচিল্ডভিউ কনট্রোলার প্রয়োজন
চার্লিএব

108

আমি মনে করি একটি উদাহরণ হাজার শব্দের মূল্যবান।

আমি একটি লাইব্রেরি অ্যাপে কাজ করছিলাম এবং যখন একটি ব্যবহারকারী একটি নোট যুক্ত করতে চায় তখন একটি দুর্দান্ত নোটপ্যাড দৃশ্য দেখাতে চেয়েছিল।

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

কিছু সমাধান চেষ্টা করার পরে, আমি নোটপ্যাডটি দেখানোর জন্য আমার নিজস্ব কাস্টম সমাধান আবিষ্কার করে শেষ করেছি। সুতরাং আমি যখন নোটপ্যাডটি দেখাতে চাই, তখন আমি একটি নতুন উদাহরণ তৈরি করি NotepadViewControllerএবং এর মূল দর্শনটিকে মূল দৃশ্যে একটি সংক্ষিপ্তসার হিসাবে যুক্ত করি। এ পর্যন্ত সব ঠিকই.

তারপরে আমি লক্ষ্য করেছি যে নোটপ্যাড চিত্রটি আড়াআড়িভাবে ল্যান্ডস্কেপ মোডে কীবোর্ডের নীচে লুকানো আছে।

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

তাই আমি নোটপ্যাড চিত্রটি পরিবর্তন করতে এবং এটিকে সরিয়ে দিতে চেয়েছিলাম। এবং এটি করার জন্য, আমি willAnimateRotationToInterfaceOrientation:duration:পদ্ধতিতে সঠিক কোডটি লিখেছি , তবে আমি অ্যাপটি চালানোর সময় কিছুই ঘটেনি! এবং ডিবাগিংয়ের পরে আমি লক্ষ্য করেছি যে এর কোনও UIViewControllerঘূর্ণন পদ্ধতি বাস্তবে ডাকা হয় নি NotepadViewController। কেবল প্রধান ভিউ কন্ট্রোলারে থাকা সেই পদ্ধতিগুলিকেই ডাকা হচ্ছে।

এটি সমাধান করার জন্য, আমাকে সমস্ত পদ্ধতি কল করা দরকার call NotepadViewController মূল ভিউ কন্ট্রোলারে । এটি শীঘ্রই জিনিসগুলিকে জটিল করে তুলবে এবং অ্যাপ্লিকেশনটিতে সম্পর্কিত নয় এমন উপাদানগুলির মধ্যে একটি অতিরিক্ত নির্ভরতা তৈরি করবে।

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

সম্পাদনা করুন: ইভেন্টের দুটি বিভাগ রয়েছে যা শিশু দেখার নিয়ন্ত্রকদের কাছে ফরোয়ার্ড করা হয়:

1- উপস্থিতি পদ্ধতি:

- viewWillAppear:
- viewDidAppear:
- viewWillDisappear:
- viewDidDisappear:

2- ঘূর্ণন পদ্ধতি:

- willRotateToInterfaceOrientation:duration:
- willAnimateRotationToInterfaceOrientation:duration:
- didRotateFromInterfaceOrientation:

আপনি কোন ইভেন্টের বিভাগগুলি ওভাররাইড করে shouldAutomaticallyForwardRotationMethodsও স্বয়ংক্রিয়ভাবে ফরোয়ার্ড করতে চান তা নিয়ন্ত্রণ করতে পারেন shouldAutomaticallyForwardAppearanceMethods


ডকুমেন্টেশন থেকে এবং দ্রুত পরীক্ষা করার পরে আমি মনে করি না যে অন্য কোনও ইভেন্ট আছে যা কেবলমাত্র আপনি addChildViewControllerপ্যারেন্ট কন্ট্রোলারের কাছে ফরোয়ার্ড করা হয়েছে ।
হেজাজি

এটি স্বয়ংক্রিয়ভাবে ইচ্ছুক ফরওয়ার্ড viewWillLayoutSubviews
MobileMon

10

-[UIViewController addChildViewController:]কেবলমাত্র ভিউকন্ট্রোলারগুলির একটি অ্যারে পাস করা ইন ভিউ কন্ট্রোলার যুক্ত করে যা একটি ভিউকন্ট্রোলার (পিতামাতা) এর রেফারেন্স রাখতে চায়। আপনাকে অন্য দৃশ্যের (যেমন প্যারেন্টভিউকন্ট্রোলারের দৃশ্যের মতামত) সংক্ষিপ্তসার হিসাবে যুক্ত করে নিজের পর্দায় সেই ভিউ কনট্রোলারের দর্শনগুলি যুক্ত করা উচিত। ইন্টারফেস বিল্ডারে স্টোরিবোর্ডে বাচ্চাদের ভিউকন্ট্রোলার্স ব্যবহার করার জন্য একটি সুবিধাজনক অবজেক্টও রয়েছে।

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

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

এটাই.


এতটুকু ভাবার জন্য আপনার ভিত্তি কী? এছাড়াও, আপনি সন্তানের দ্বারা প্রাপ্ত 'সিস্টেম ইভেন্টগুলি' এর একটি তালিকা সরবরাহ করতে পারেন? একটি গুগল অনুসন্ধান iOS "system events"খুব বেশি আপ দেয় না; এটি অ্যাপল ব্যবহার করে এমন একটি শব্দ বলে মনে হচ্ছে না?
মার্ক আমেরিকা

এটি মূলত একটি সুবিধার পদ্ধতি যা আপনাকে ভিউ কন্ট্রোলার এ এর ​​একটি সংক্ষিপ্তসার হিসাবে ভিউ কন্ট্রোলার বি এর ভিউ যোগ করার অনুমতি দেয় তবে এখনও ভিউ কন্ট্রোলার বি এর দৃশ্য পরিচালনা করে। এটি সঠিকভাবে কাজ করার জন্য, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে দেখুন কন্ট্রোলার বি সিস্টেম ইভেন্টগুলি পেয়েছে (ইউআইভিউকন্ট্রোলারডেলিগেট কলব্যাকগুলি পড়ুন)। 'অ্যাডচিল্ডভিউ কনট্রোলার' আপনাকে ম্যানুয়ালি সবকিছু পাস করার প্রচেষ্টা বাঁচানোর জন্য এটি আপনার জন্য সন্ধান করে।
স্যাম ক্লেওলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.