मैं सिर्फ iOS विकास में पहली बार अपने पैरों को डुबो रहा हूं, और मुझे जो पहली चीज करनी है, वह कस्टम कंटेनर व्यू कंट्रोलर को लागू करना है - इसे कॉल करने देता है SideBarViewController
- जो कई संभावित चाइल्ड व्यू कंट्रोलरों में से इसे स्वैप करता है दिखाता है, लगभग एक मानक टैब बार नियंत्रक की तरह । (यह एक टैब बार नियंत्रक की तुलना में बहुत अधिक है, लेकिन टैब बार के बजाय छिपने योग्य साइड मेनू के साथ है।)
Apple दस्तावेज़ीकरण के निर्देशों के अनुसार, addChildViewController
जब भी मैं अपने कंटेनर में एक बच्चा ViewController जोड़ता हूं , तो मैं कॉल करता हूं। वर्तमान बाल दृश्य नियंत्रक को स्वैप करने के लिए मेरा कोड 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;
}
... तो मेरा ऐप अभी भी पूरी तरह से काम करता है, जहाँ तक मैं बता सकता हूँ!
Apple प्रलेखन क्या addChildViewController
करता है, या हम इसे क्यों कहते हैं, इस पर बहुत प्रकाश नहीं डालते हैं। वर्तमान में UIViewController
क्लास रेफरेंस में इसके सेक्शन में क्या किया जाता है या क्यों इस्तेमाल किया जाना चाहिए, इसके प्रासंगिक विवरण की पूरी सीमा इस प्रकार है :
दिए गए दृश्य नियंत्रक को एक बच्चे के रूप में जोड़ता है। ... इस विधि को केवल एक कस्टम कंटेनर व्यू कंट्रोलर के कार्यान्वयन द्वारा बुलाया जाना है। यदि आप इस विधि को ओवरराइड करते हैं, तो आपको अपने कार्यान्वयन में सुपर कॉल करना होगा।
उसी पृष्ठ पर पहले भी यह अनुच्छेद है:
आपके कंटेनर व्यू कंट्रोलर को बच्चे के रूट दृश्य को पदानुक्रम में जोड़ने से पहले एक चाइल्ड व्यू कंट्रोलर को अपने साथ जोड़ना होगा। यह iOS को चाइल्ड व्यू कंट्रोलर्स और उन नियंत्रकों को प्रबंधित करने वाले विचारों को ठीक से रूट करने की अनुमति देता है। इसी तरह, यह अपने दृश्य पदानुक्रम से एक बच्चे के मूल दृश्य को हटाने के बाद, उसे स्वयं से उस बच्चे के दृश्य नियंत्रक को डिस्कनेक्ट करना चाहिए। इन संघों को बनाने या तोड़ने के लिए, आपका कंटेनर बेस क्लास द्वारा परिभाषित विशिष्ट तरीकों को कॉल करता है। इन विधियों का उद्देश्य आपके कंटेनर वर्ग के ग्राहकों द्वारा बुलाया जाना नहीं है; अपेक्षित कंटेंट व्यवहार प्रदान करने के लिए उन्हें केवल आपके कंटेनर के कार्यान्वयन द्वारा उपयोग किया जाना है।
यहाँ आवश्यक तरीके हैं जिन्हें आपको कॉल करने की आवश्यकता हो सकती है:
AddChildViewController : removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
लेकिन यह इस बात की पेशकश नहीं करता है कि 'ईवेंट्स' या 'अपेक्षित कंटेंट बिहेवियर' क्या है जिसके बारे में यह बात कर रहा है या क्यों (या तब भी) जब इन तरीकों को कॉल करना 'आवश्यक' है।
Apple डॉक्यूमेंट के "कस्टम कंटेनर व्यू कंट्रोलर्स" सेक्शन में कस्टम कंटेनर व्यू कंट्रोलर्स के उदाहरण सभी इस विधि को कहते हैं, इसलिए मेरा मानना है कि यह कुछ महत्वपूर्ण उद्देश्य से परे है जो कि बच्चे को व्यूऑनलाइनर व्यूअर को पॉपअप करने से परे है, लेकिन मैं समझ नहीं पा रहा हूं वह उद्देश्य क्या है। यह विधि क्या करती है, और मुझे इसे क्यों कॉल करना चाहिए?