2013-01-04 13 views
17

एक बच्चा दृश्य नियंत्रक बच्चे दृश्य नियंत्रक के कार्यान्वयन में निम्न कोड से निकाल दिया जाता है:अभिभावक दृश्य नियंत्रक को कैसे सूचित किया जाता है कि बच्चे के दृश्य नियंत्रक ने स्वयं को हटा दिया है?

- (void)commandFinishVC 
{ 
    [ self.view removeFromSuperview]; 
    [ self removeFromParentViewController ]; 
} 

बच्चे दृश्य नियंत्रक और उसके दृश्य को सफलतापूर्वक निकाल दिया जाता है, लेकिन कैसे माता-पिता इस के बारे में सूचित किया जाता है? -viewDidDisappear को नहीं कहा जाता है और -viewDidUnload को बहिष्कृत कर दिया गया है।

उदाहरणों से मुझे मिल सकता है, यह हमेशा माना जाता है कि अभिभावक व्यू कंट्रोलर बच्चे को हटाए जाने वाले नामांकन की उत्पत्ति का उत्प्रेरक है लेकिन (मेरे लिए) बच्चे को पूरा होने के लिए तर्क में स्वायत्त होना चाहिए।

क्या self.parentViewController प्रॉपर्टी का उपयोग करके निकालने के तरीकों को कॉल किया जाना चाहिए और पैरेंट व्यू कंट्रोलर में निम्न की तरह कुछ उपयोग करना चाहिए?

- (void)commandFinishVC 
{ 
    [ childVC.view removeFromSuperview]; 
    [ childVC removeFromParentViewController ]; 
} 

उत्तर

25

हाँ, अपने माता पिता के नियंत्रक आम तौर पर, इसके अलावा और बच्चे नियंत्रक को हटाने को नियंत्रित करना चाहिए ताकि आपके दूसरा दृष्टिकोण अधिक लागू लगता है। UIViewController क्लास संदर्भ के Implementing a Container View Controller अनुभाग देखें।

मैं तुम्हें दूर अपने पूर्व दृष्टिकोण, जहां बच्चे अपने आप को हटा रहा है के साथ मिल सकता है संदेह है, लेकिन एप्पल अपने दस्तावेज में संगत है और Implementing UIViewController Containment पर WWDC 2011 सत्र का कहना है कि कंटेनर नियंत्रक बच्चों के प्रबंधन के लिए जिम्मेदारी भालू।

तो, आपके बच्चे के माता-पिता को यह सूचित करने के जवाब में कि कैसे हटा दिया गया है, उसके लिए कोई स्थापित प्रोटोकॉल नहीं है। लेकिन यह असुरक्षित है क्योंकि यह माना जाता है कि माता-पिता इस प्रक्रिया को शुरू करेंगे। और इस हद तक कि एक बच्चे को इस प्रक्रिया को शुरू करने की आवश्यकता है, दस्तावेज़ीकरण से पता चलता है कि माता-पिता को बाल नियंत्रकों के प्रबंधन के लिए सार्वजनिक एपीआई होना चाहिए।

इसलिए माता-पिता को सूचित करने वाले बच्चे के लिए कोई प्रोटोकॉल नहीं है, हालांकि, एक प्रकाशित एपीआई है जिसके द्वारा अभिभावक नियंत्रक बच्चों को सूचित करते हैं कि उन्हें स्थानांतरित/हटा दिया गया है। विशेष रूप से, जब अभिभावक नियंत्रक किसी बच्चे को हटा रहा है, तो उसे willMoveToParentViewController पर कॉल करना चाहिए। This documentation स्पष्ट रूप से कहते हैं कि हम इस अधिसूचना प्रदर्शन करना होगा:

आप अपने खुद के कंटेनर दृश्य नियंत्रक को लागू कर रहे हैं, यह removeFromParentViewController विधि कॉल करने से पहले बच्चे को देखने के लिए नियंत्रक के willMoveToParentViewController: विधि कॉल करना होगा ...

इस प्रकार, के रूप में देखें नियंत्रक प्रोग्रामिंग गाइड के Adding and Removing a Child भाग में चर्चा की, जब एक बच्चे, हम चाहिए को हटाने:

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

अनजाने में, didMoveToParentViewController के लिए प्रलेखन समान रूप से स्पष्ट है: जब आप एक बच्चे नियंत्रक जोड़ते हैं, तो आपको एनीमेशन/संक्रमण (यदि कोई हो) होने पर didMoveToParentViewController पर कॉल करना होगा। मुझे नहीं पता कि क्या होगा यदि हमने इन दो अधिसूचना विधियों को नहीं बुलाया, लेकिन ऐप्पल का कहना है कि हमें ऐसा करना चाहिए और इसलिए ऐसा करना समझदार है।

+0

इसका कारण एक शुद्ध कंटेनर के रूप में वीसी (देखें नियंत्रक) कंटेनर का उपयोग है, इसमें कोई विचार नहीं है। बच्चे के कंटेनर के विचारों में उनके संबंधित कार्यक्रम होते हैं; इसलिए बच्चे वीसी (जैसे एक पूरा करने वाला बटन दबाकर) में कार्रवाई बच्चे वीसी की रिहाई को निर्धारित करती है। – Roddy

+0

उत्तर देने के लिए बहुत धन्यवाद, यह वास्तव में जो कुछ मैं पढ़ रहा हूं उसे स्पष्ट करने में मदद करता हूं। – Roddy

+0

रॉब, क्या आपको पता है कि क्या होगाMoveToParentViewController: यदि आप अपने बच्चे के दृश्य नियंत्रक में उस विधि को ओवरराइड नहीं कर रहे हैं तो वास्तव में आवश्यक है? ऐप्पल के दस्तावेज़ इसे ध्वनि बनाते हैं जैसे आप इसे कॉल करना चाहते हैं, लेकिन अगर आप इसे अपने बच्चे में ओवरराइड नहीं करते हैं तो मैं यह नहीं समझ सकता कि यह वास्तव में कुछ भी करता है। अगर मैं उस विधि को नहीं बुलाता तो मुझे कोई समस्या नहीं आई है। – rdelmar