iOS नेस्टेड व्यू कंट्रोलर्स UIViewController के अंदर का व्यू?


90

आईओएस में आमतौर पर खराब प्रोग्रामिंग प्रैक्टिस के लिए यूआईवीवाईकंट्रोलर की नजर में नेस्टेड व्यू कंट्रोलर का नजरिया है? उदाहरण के लिए कहें कि मैं किसी प्रकार का संवादात्मक तत्व चाहता था जो उपयोगकर्ता के स्पर्शों के प्रति प्रतिक्रिया करता हो, लेकिन केवल 25% स्क्रीन को ही लेता है।

मुझे लगता है कि मैं इस तरह के कुछ कहकर अपने UIViewController को नेस्टेड व्यू कंट्रोलर जोड़ूंगा:

[self.view addSubview: nestedViewController.view];

6
यहाँ बहुत सारे चित्रों के साथ एक पूर्ण ट्यूटोरियल है !! stackoverflow.com/a/23403979/294884 आनंद लें
फेटी

जवाबों:


148

नहीं, यह आम तौर पर अच्छा डिजाइन है, यह आपके विचार नियंत्रकों को संक्षिप्त रखने में मदद करता है। हालाँकि आपको व्यू कंट्रोलर कंटेंट पैटर्न का उपयोग करना चाहिए, निम्नलिखित प्रलेखन पर एक नज़र डालें।

एक कंटेनर दृश्य नियंत्रक को लागू करना

यह स्टोरीबोर्ड के साथ इंटरफ़ेस बिल्डर का उपयोग करके सेटअप करने के लिए अविश्वसनीय रूप से सरल है, ऑब्जेक्ट लाइब्रेरी में कंटेनर व्यू पर एक नज़र डालें।

यहाँ एक स्टोरीबोर्ड में एक आकस्मिक उदाहरण है। इस उदाहरण में आपके पास 4 दृश्य नियंत्रक होंगे, एक जो 3 कंटेनर रखता है, और प्रत्येक कंटेनर के लिए एक। जब आप बाईं ओर सबसे अधिक नियंत्रक रखते हैं, जिसमें सभी कंटेनर होते हैं, तो स्टोरीबोर्ड स्वचालित रूप से आरंभ करेगा और दूसरे को एम्बेड करेगा। आप इन चाइल्ड व्यू कंट्रोलर्स को childViewControllersसंपत्ति के माध्यम से एक्सेस कर सकते हैं या कोई ऐसा तरीका है जिससे आप prepareForSegue:sender:गंतव्य दृश्य नियंत्रकों को ओवरराइड और कैप्चर कर सकते हैं बुलाया जाना चाहिए के बारे में बहस। अगर जरूरत हो तो चाइल्ड व्यू कंट्रोलर्स को प्रॉपर्टी पास करना भी एक अच्छा पॉइंट है।

यहाँ छवि विवरण दर्ज करें


42
कैसे "नरक" आप स्टोरीबोर्ड में ऐसा करते हैं ?! यह एक बुनियादी सवाल है .. मुझे इसका जवाब नहीं पता :) Sigh - अपने सवाल का जवाब देना। दृश्य में एक कंटेनर जोड़ें । आकार दो। फिर स्टोरीबोर्ड के रिक्त क्षेत्रों पर एक UIViewController बनाते हैं। फिर उस कंटेनर से राइट-क्लिक-ड्रैग (या तो नेविगेटर सूची या GUI) में उस नए UIViewController के लिए करें। पॉपअप से, आरंभ करने के लिए viewDidLoad-एम्बेड चुनें। धन्यवाद क्रिस! :)
फटी

लिंक टूट गया है, वैसे।
बेंजॉन

2
@JoeBlow +1 "viewDidLoad- एम्बेड" पवित्र गाय: जिसने अनुमान लगाया होगा कि!
21

धन्यवाद @ क्रिस वाग्नेर! यह एमवीवीएम वास्तुकला को लागू करने और बड़े पैमाने पर देखने वाले नियंत्रक / "एमवीसी" से बचने के लिए पहेली का एक महत्वपूर्ण टुकड़ा है;)
रोब

54

मैंने इस कोड को पैरेंट व्यू कंट्रोलर में डाल दिया है। यह मेरे लिए बहुत अच्छा काम करता है।

ओबज सी

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

स्विफ्ट :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

एक अन्य विकल्प आईबी का उपयोग करना और कंटेनर दृश्य डालना है। UIViewController स्वचालित रूप से दिखाई देगा (XCode 9 इस मामले में): यहाँ छवि विवरण दर्ज करें


2
हाँ! +1। यह कैसे प्रोग्राम के लिए यह करने के लिए एक उत्तर शामिल करने के लिए धन्यवाद :)
सी। Tewalt

मैंने चाइल्ड व्यू कंट्रोलर से पैरेंट सबव्यू की सूची में सिर्फ ड्रैग एंड ड्रॉप दृश्य देखा है।
डिंपीयाक्स

5

यहाँ मेरा स्विफ्ट 3 समाधान है जो एफबी के जवाब पर स्विफ्ट डेवलपर्स पर आधारित है

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.