2012-01-26 12 views
17

Ive मेरे बाल बाहर पिछले कुछ दिनों से अधिक यह एक आईओएस विकास के उचित रूप में बुनियादी अवधारणा को समझने की कोशिश कर रहा फाड़ दिया:समझना देखें नियंत्रक नेस्टिंग आईओएस में

  • अगर मैं दो या अधिक देखें नियंत्रकों करना चाहते हैं एक ही "screenful" में दिखाया गया है और प्रयोग करने योग्य, यह है:

    के रूप में प्रति एप्पल के
  • पूरी तरह से संभव "सामग्री के screenful प्रति कुलपति"
    1. उचित नहीं जोड़कर कुलपति कोड
    2. के माध्यम से
    3. अभी नहीं किया गया। इसके बजाय, एक वीसी का उपयोग करें और बस उस कोड को जोड़ें जो आपके इच्छित व्यू कंट्रोलर की कार्यक्षमता की नकल करता है।

मुझे थोड़ी अलग तरीके से व्यक्त करते हैं:

अगर मैं चाहता था करने के लिए, एक iPad ऐप्लिकेशन, एक UIView (ए) कि स्क्रीन के बाईं ओर के एक बड़े हिस्से तक ले जाता है, में और एक दूसरा UIView (बी) जो स्क्रीन के बाकी दाहिने तरफ लेता है, और मैं UIView बी पर एक बटन जोड़ना चाहता था, जब क्लिक किया गया तो UIView B को प्रतिस्थापित करने के लिए UITableview को स्लाइड करने के लिए मॉडल संक्रमण का उपयोग किया जाएगा, और यह UITableview फिर एक विशिष्ट UITableviewController की तरह कार्य करेगा जिससे उपयोगकर्ता तालिका से कोई आइटम चुनता है, सामान्य घटनाएं भेजी जाती हैं आइटम के नए सेट में धक्का देने के लिए टेबलव्यू नियंत्रक को, क्या यह संभव है?

यह मुझे लगता है कि अगर मैं पहले से ही दो अलग-अलग UIViewControllers बनाने में सक्षम हूं, और एक वीसी में एक बटन है तो दूसरे वीसी को आम तौर पर लाता है, मैं इस कार्यक्षमता को क्यों जोड़ सकता हूं ताकि एक वीसी में दो बच्चे वीसी हो, और वे बच्चे वीसी अपने स्वयं के मोडल संक्रमणों को संभालते हैं।

या इस तरह के मामले में सबसे अच्छा अभ्यास है, जिसमें बस एक वीसी है जो सब कुछ संभालती है, और उसके बाद मैन्युअल रूप से विभिन्न यूआई तत्वों पर विभिन्न क्लिकों के बाद विभिन्न दृश्यों में स्लाइड को एनिमेट करने में संभालती है?

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

+0

आप ऐसा करने के लिए एक अच्छा तरीका मिला आईओएस 5 में? जिस समस्या को मैं हल करना चाहता हूं वह आपके संदर्भ में अच्छी तरह परिभाषित है http://www.tumblr.com/tagged/child-view-controller। मास्टर व्यू को कोड भारी होने से रोकने के लिए मास्टर दृश्य के अंदर विभिन्न टुकड़ों को घोंसला करना अच्छा होगा। – mm2001

उत्तर

2

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

एक व्यू कंट्रोलर दृश्यों का एक सेट प्रबंधित करता है। आपके पास कंटेंट व्यू कंट्रोलर और कंटेनर/नेविगेशन व्यू कंट्रोलर हो सकते हैं जो व्यू कंट्रोलर के पदानुक्रम का प्रबंधन करते हैं (उदाहरण: नेविगेशन व्यू कंट्रोलर एक सूचीदृश्य नियंत्रक और एक विस्तार नियंत्रक का प्रबंधन कर सकता है)।

यह और अधिक विस्तार यहाँ में शामिल है:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457

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

एकाधिक व्यू कंट्रोलर एक एकीकृत उपयोगकर्ता इंटरफ़ेस प्रस्तुत करने के अपने प्रयासों को समन्वयित करते हैं।

+0

लिंक मर चुका है। – hnh

11

उत्तर इस बात पर निर्भर करता है कि आपको आईओएस 4 का समर्थन करने की आवश्यकता है या नहीं। अगर हां, तो जवाब है:

जवाब नंबर 1 - एप्पल अपने खुद के कंटेनर नियंत्रकों, विशेष रूप से UITabBarController, UINavigationController, UISplitViewController, UIPageViewController और UIPopoverController के अपवाद के साथ (? था कि मैं किसी भी याद आती है) वहाँ ठीक से समर्थित नहीं है जिस तरह से कई के लिए दृश्य के विभिन्न हिस्सों को प्रबंधित करने, एक ही स्क्रीन पर सक्रिय नियंत्रकों को देखें। वर्तमान मॉड्यूल व्यू कंट्रोलर जैसे कंट्रोलर विधियों को देखें, सभी इस धारणा पर काम करते हैं कि एकमात्र "फ्रंटस्टोर" व्यू कंट्रोलर है जो पूरी स्क्रीन का मालिक है, और यदि आप एकाधिक व्यू कंट्रोलर देखने के विभिन्न हिस्सों को प्रबंधित करने का प्रयास करते हैं, तो सभी प्रकार की चीजें ब्रेक, जैसे स्क्रीन रोटेशन इवेंट्स को अग्रेषित करना और पेज संक्रमण के बाद विचारों का आकार बदलना/स्थिति बनाना।

लेकिन यदि आप केवल iOS 5 समर्थन करने के लिए की जरूरत है, जवाब है:

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

दुर्भाग्य से, ऐप्पल ने केवल आईओएस 5 में childViewControllers और parentViewControllers के लिए सार्वजनिक सेटर्स जोड़े। आईओएस 4 में और इससे पहले आप ऐप्पल के कंटेनर कंट्रोलर व्यवस्था तक ही सीमित हैं और अपना खुद का निर्माण नहीं कर सकते (कम से कम, घटना अग्रेषण मुद्दों के बिना नहीं)।

तो मान लीजिए कि आपको अभी आईओएस 4 का समर्थन करने की आवश्यकता है, उत्तर संख्या 3 आपकी सबसे अच्छी शर्त की तरह दिखता है: एकाधिक विचारों का उपयोग करके अपना इंटरफ़ेस बनाएं लेकिन एक नियंत्रक। हालांकि यह बहुत बुरा नहीं है। आप कस्टम व्यू उप-वर्ग बना सकते हैं जो वारिस के अपने सबव्यूज़ प्रबंधित करते हैं (उदाहरण के लिए कोई नियम नहीं है जो एक टेबल व्यूडेटा स्रोत या प्रतिनिधि को UIViewController subclass होना चाहिए, या एक बटन IBAction को किसी अन्य दृश्य के बजाय व्यू कंट्रोलर पर एक विधि होना चाहिए)।

आपको वास्तव में पता चलेगा कि आप आमतौर पर एक दृश्य नियंत्रक में निर्मित अधिकांश कार्यक्षमता को "स्मार्ट" कंटेनर व्यू में बनाया जा सकता है, जिससे आप अपनी स्क्रीन को कई स्टैंडअलोन "नियंत्रक-दृश्य" में विभाजित कर सकते हैं जो उनका प्रबंधन करते हैं अपनी सामग्री

एकमात्र बिट जो मुश्किल है, एक दृश्य और अगले के बीच संक्रमण की तरह सामान कर रहा है। इसके लिए आप मानक presentModalViewController या pushViewController विधियों का उपयोग करने में सक्षम नहीं होंगे, आपको CATransitions या UIView एनिमेशन का उपयोग करके एनिमेशन स्वयं करना होगा।

+0

हां मैंने डब्ल्यूडब्ल्यूडीसी वीडियो पर चर्चा की कि कैसे नियंत्रकों के माता-पिता और बच्चे के दृश्य नियंत्रक हो सकते हैं, हालांकि अधिकांश डब्ल्यूडब्ल्यूडीसी वीडियो के साथ वे यहां और कुछ विवरणों पर स्कीम करते हैं। हालांकि यह सहायक है। क्या आईबी के माध्यम से ऐसा करना संभव है? जितना कठिन मैं कोशिश करता हूं, मुझे लगता है कि आईबी के माध्यम से एक ही स्क्रीनफुल में दो वीसी कैसे प्राप्त करें, यह हमेशा हर वीसी के लिए एक नया स्क्रीनफुल बनाता है। –

+1

Ive ने इस वेबसाइट को विषय पर कुछ बेहतर स्पष्टीकरण के साथ पाया: http://www.tumblr.com/tagged/child-view-controller, हालांकि यह बताता है कि आपको प्रोग्रामव्यूटर को प्रोग्रामिक रूप से जोड़ना होगा और उन्हें प्रोग्रामेटिक रूप से भी स्थिति में रखना होगा। मैं उम्मीद कर रहा था कि आईबी के माध्यम से इन नियंत्रकों को जोड़ने और पोजिशन करने का कोई दृष्टिकोण होगा, अगर कोई जानता है। –

+1

मुझे नहीं लगता कि आप इसे आईबी में कर सकते हैं। आप क्या कर सकते हैं "आईबी में स्टेटस बार सेट करके आईबी में अपने व्यू कंट्रोलर के रूट व्यू का आकार सेट करें, जो इंस्पेक्टर में चौड़ाई/ऊंचाई नियंत्रण को अक्षम नहीं करेगा। इसके बाद आप अलग-अलग निब्स के रूप में आईबी में प्रत्येक सब-व्यू के लिए लेआउट डिज़ाइन कर सकते हैं और उसके बाद केवल कोड नियंत्रकों को कोड में चिपका सकते हैं, जो बहुत खराब नहीं होना चाहिए यदि आपके पास केवल एक या दो स्क्रीन हैं। –

3

यह आईओएस 4 में निश्चित संभव है:

  • alloc init दृश्य नियंत्रक "बी" आप अपना दृश्य नियंत्रक पर पड़ा हैं:

    आप अपने दृश्य के साथ एक दृश्य नियंत्रक 'ए' है "ए"

  • कॉल (शून्य) addSubview: (UIView *) दृश्य नियंत्रक "ए" के दृश्य पर दृश्य नियंत्रक "बी" के दृश्य के साथ पैरामीटर
  • दृश्य के दृश्य का दृश्य नियंत्रक "बी" addSubView की वजह से पूर्णस्क्रीन पर सेट है, इसलिए इसे बदलें व्यू कंट्रोलर "ए" के दृश्य पर जहां आप चाहते हैं उसे देखने के लिए।
  • जब आप एक अच्छा प्रदर्शन करने के लिए फ्रेम बदलते हैं तो कुछ UIView एनिमेशन जोड़ें।

IOS5 पर सिर्फ अपने दृश्य नियंत्रक 'ए' पर विधि का उपयोग करें:

  • (शून्य) addChildViewController: (UIViewController *) childController
संबंधित मुद्दे