2011-12-05 4 views
103

डब्ल्यूडब्ल्यूडीसी 2011 सत्र 102 में, ऐप्पल ने व्यू कंट्रोलर कंटेंटेशन पेश किया, जो कस्टम व्यू कंट्रोलर कंटेनर बनाने की क्षमता है, UITabBarController, UINavigationController, और इसी तरह के समान है।आईओएस 5 में कंट्रोलर कंटेंटमेंट कैसे काम करता है?

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

परिदृश्य 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] कॉल कर सकता करने के लिए बदल रहे हैं? सत्र 102 में इस उदाहरण में नहीं किया गया है, लेकिन मुझे नहीं पता कि यह चूक है या नहीं।

परिदृश्य 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]; 

प्रश्न

मेरा मुख्य सवाल यह है? क्या ऊपर दिए गए यांत्रिकी सही हैं?

addChildViewController पर कॉल करने से पहले willMoveToParentViewController पर कॉल करना आवश्यक है? यह मेरे लिए तार्किक आदेश की तरह लगता है, लेकिन क्या यह सख्ती से जरूरी है?

removeFromParentViewController पर कॉल करने के बाद didMoveToParentViewController:nil पर कॉल करना आवश्यक है?

+9

समस्या यह थी कि जब मैंने आईओएस 5 टैग जोड़ने की कोशिश की, तो मैंने गलती से प्रवेश किया, जिसने पोस्ट को जोड़ा/भले ही मैंने इसे लिखना/संपादित नहीं किया था। मैंने इसे हटाने की कोशिश की लेकिन फिर पाया कि मैं इसे हटाने के लिए केवल * वोट * कर सकता हूं। –

उत्तर

71

UIViewController दस्तावेज़ willMove/didMove विधियों को कब और कब कॉल नहीं करते हैं, इस पर बहुत स्पष्ट हैं। "Implementing a Container View Controller" दस्तावेज़ीकरण देखें।

दस्तावेज़ कहते हैं कि यदि आप addChildViewController ओवरराइड नहीं करते हैं, तो आपको willMoveToParentViewController: विधि को कॉल करने की आवश्यकता नहीं है। हालांकि संक्रमण पूर्ण होने के बाद आपको didMoveToParentViewController: विधि को कॉल करने की आवश्यकता है। "इसी तरह, removeFromParentViewController विधि को कॉल करने से पहले willMoveToParentViewController: विधि को कॉल करने के लिए कंटेनर व्यू कंट्रोलर की ज़िम्मेदारी है। removeFromParentViewController विधि बच्चे दृश्य नियंत्रक की didMoveToParentViewController: विधि को कॉल करती है।"

इसके अलावा, एक उदाहरण है here और नमूना कोड here

गुड लक

+15

मैं देखता हूं, इसलिए 'addChildViewController' को' didMoveToParentViewController' के साथ संतुलित किया जाना चाहिए और 'willMoveToParentViewController' को 'RemoveFromParentViewController' के साथ संतुलित किया जाना चाहिए। यही वह है जिसकी तलाश में मैं हूं। यह सुनिश्चित नहीं है कि मैंने दस्तावेज़ों में इसे कैसे याद किया। –

+0

क्यों नहीं? आपको WillMoveToParentViewController क्यों कॉल करने की आवश्यकता नहीं है, लेकिन hae को कॉल करने के लिए hMoveToParentViewController? –

+0

क्योंकि दस्तावेज़ यही कहते हैं। ऐप्पल स्पष्ट रूप से महसूस करता है कि हमें जानने की जरूरत नहीं है। –

21

इस भाग सही नहीं है:

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

According to the docs:

अपने कस्टम कंटेनर addChildViewController फोन करता है: विधि, यह स्वतः ही willMoveToParentViewController कॉल: देखने की विधि इसे जोड़ने से पहले एक बच्चे के रूप में नियंत्रक जोड़ा जाना चाहिए।

तो आपको [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]; 

For removing view controllers:

removeFromParentViewController विधि स्वतः didMoveToParentViewController कॉल: बच्चे दृश्य नियंत्रक की विधि के बाद यह बच्चे को हटा।

संभवतः यह कॉल [oldVC didMoveToParentViewController:nil] है।

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

ऐसा प्रतीत होता है कि यदि अन्यथा किया जाता है, भले ही यह काम करता प्रतीत होता है, प्रस्तुतकर्ताViewController प्रस्तुत दृश्य नियंत्रक पर सेट नहीं है। – Adrian

+0

डॉक्स कहते हैं कि 'didMoveToParentViewController' कॉल करें ** ** तुरंत ** addChildViewController को कॉल करने के बाद: विधि ", यह निर्दिष्ट नहीं करता है कि जब आप वास्तव में बाल सबव्यू जोड़ते हैं। मुझे आश्चर्य है कि अगर हर किसी को यह गलत लगता है। क्या कुछ ऐप्पल डॉक्स में कोई उदाहरण है, हम इसे जांच सकते हैं? – Robert

+0

नोट: यदि आप जिस आइटम को ले जा रहे हैं, उसे 'addMoveToParentViewController'' से पहले 'willMoveToParentViewController' को कॉल करने की आवश्यकता है, तो 'addChildViewController' ओवरराइड के साथ एक कस्टम क्लास है (जब तक कि आपका ओवरराइड इसे आंतरिक रूप से कॉल न करे) – bunkerdive