5

मेरे पास एक UIViewController है - चलिए इसे "फॉर्म कंट्रोलर" कहते हैं - जो कि एक ऑब्जेक्ट को संपादित करने वाला एक रूप है। मैं 2 विभिन्न स्थितियों में उपयोग करना चाहते हैं:मॉड्यूल और गैर-मोडल स्थितियों के लिए UIViewController का उपयोग करना

  1. एक नई वस्तु का निर्माण - UINavigationController के presentModalViewController: विधि का उपयोग कर का उपयोग करते हुए।

  2. किसी मौजूदा ऑब्जेक्ट को संपादित करना - दृश्य नियंत्रक को UINavigationController स्टैक पर दबाएं, एक संवाद विधि का उपयोग न करें।

मैं के साथ "रद्द करें" और "हो गया" बटन, जबकि ढेर स्थिति में मैं सिर्फ नेविगेशन पट्टी प्रदान की है करने के लिए चाहते हैं एक उपकरण पट्टी करना चाहते हैं मोडल स्थिति में उस में कुछ अंतर नहीं है UINavigationController द्वारा।

यह संपर्क एप्लिकेशन के समान होगा जहां "नया संपर्क" और "संपर्क संपादित करें" स्क्रीन समान दृश्य नियंत्रक का उपयोग करने लगती हैं, लेकिन नया संपर्क फ़ॉर्म सामान्य रूप से प्रस्तुत किया जाता है जबकि संपादन स्क्रीन नेविगेशन पर धक्का दिया जाता है ढेर।

मेरा प्रश्न है: 2 अलग-अलग लिखने के बिना दोनों परिस्थितियों को संभालने का सबसे अच्छा तरीका क्या है, लेकिन अधिकतर समान दृश्य नियंत्रक?

मैं एक "ModalFormController" जो रचना के माध्यम से नंगे "FormController" समाहित है और एक उपकरण पट्टी कहते हैं बनाने के बारे में सोचा था, लेकिन मैं डॉक्स कि एप्पल नेस्टिंग दृश्य नियंत्रकों की सिफारिश नहीं करता में कहीं पढ़ा है।

उत्तर

2

मैं क्या करता हूं (कभी-कभी) enum स्थापित करता है जो दृश्य नियंत्रक के प्रकार को निर्दिष्ट करता है।

उदाहरण के लिए, आपके पास दो प्रकार हो सकते हैं: Edit प्रकार, और Add ("नया") प्रकार।

Add प्रकार एक मोडल व्यू कंट्रोलर के माध्यम से लागू किया गया है, जबकि Edit प्रकार को मौजूदा नेविगेशन स्टैक पर धक्का दिया जाता है।

दृश्य नियंत्रक की -viewDidLoad: विधि में, मैं बस switch/case पेड़ करता हूं जो ऊपर उल्लिखित प्रकार गणना के आधार पर शीर्षक और अन्य उपस्थिति विशेषताओं को सेट करता है।

इस बारे में अच्छी बात यह है कि एक नया प्रकार जोड़ना आसान है। नकारात्मकता यह है कि इस गणना को सौंपने के लिए सशर्त पेड़ जटिल रूप से जटिल हो सकता है, इस पर निर्भर करता है कि प्रकार कितने अलग हैं।

लेकिन switch/case पेड़ इसे प्रबंधित करने में बहुत आसान बनाता है।

तो, यह इस बात पर निर्भर करता है कि आप दो प्रकार के साथ क्या करने का प्रयास कर रहे हैं। लेकिन यह निश्चित रूप से करने योग्य है।

+2

धन्यवाद एलेक्स। मुझे लगता है कि सभी उत्तरों वैध थे लेकिन कुछ विचार-विमर्श के बाद मैं आपके द्वारा निर्धारित दिशा में जा रहा हूं। मैं बस एक बूल का उपयोग करने जा रहा हूं जो जानता है कि फॉर्मकंट्रोलर को आम तौर पर प्रदर्शित किया जा रहा है या नहीं। – Sam

3

उपclassing का उपयोग क्यों नहीं? ModalCreateFormControllerEditFormController का उप-वर्ग बनाएं और उप-वर्ग में मोडल-विशिष्ट सामग्री को संभाल लें।

+0

मैंने इसके बारे में भी सोचा। हो सकता है कि मैं अगली बार कोशिश करूंगा ... मुझे वास्तव में कठिन समय तय करना था कि किस तरह से जाना है। – Sam

2

दृश्य नियंत्रक पर एक स्पष्ट संपत्ति (एलेक्स रेनॉल्ड्स पता चलता है के रूप में) होने के अलावा, दो अन्य तरीकों है कि मेरे पास पाए जाते हैं:

  1. क्या आप कर रहे हैं कि मॉडल वस्तु किसी तरह का है, तो संपादन, इसे अपने वर्तमान राज्य के लिए पूछें। यदि यह कभी भी सहेजा गया है, तो आप संपादन मोड में हैं। अन्यथा, आप बना मोड में हैं।

  2. नियंत्रक की parentViewController संपत्ति के मूल्य को देखें। यदि यह UINavigationController का उदाहरण है, तो आप नेविगेशन स्टैक में हैं। यदि आप मॉड्यूल रूप से प्रदर्शित किए जा रहे हैं, तो यह आपकी सूची नियंत्रक का एक उदाहरण होगा।

+0

धन्यवाद Sixten। मैं ऊपर दिए गए एलेक्स के जवाब के साथ # 2 में उस विचार का उपयोग करने जा रहा हूं। – Sam

0

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

ज्यादातर मामलों में यह विधि रूट व्यू कंट्रोलर के रूप में स्वयं के साथ एक UINavigationController बनाता है और स्वयं को जांचने के लिए बार-बार कॉल के साथ कॉल करता है और इसके बदले में यह शून्य नहीं होता है)। अन्य मामलों में मैंने पहले एक डमी रूट नियंत्रक बनाया और बैक बटन प्राप्त करने के लिए दूसरे पर स्वयं को धक्का दिया। फिर बैक बटन प्रेस को पकड़ने के लिए एक चाल का उपयोग किया जा सकता है: http://smallduck.wordpress.com/2010/10/05/intercepting-uinavigationcontroller/

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

1

यूजी, मैं अतिरिक्त ivars नफरत ...

मैं इस के बजाय का उपयोग करें:

if([[self.navigationController viewControllers] objectAtIndex:0] == self){ 

     //Modal 

    }else{ 

     //Pushed 

    } 

यह एक हैक का एक सा है, लेकिन हम तर्क का उपयोग कर रहे है कि हमलावर दृश्य नियंत्रक पहले है अगर ढेर में, आप वापस नहीं जा सकते हैं। असल में हम इस तथ्य को अनदेखा कर रहे हैं कि यह सामान्य रूप से प्रदर्शित है या नहीं।

+1

मैं UIViewController के लिए एक वर्ग में इस कर दिया: - (bool) isModal { \t वापसी ([[self.navigationController viewControllers] objectAtIndex: 0] == स्वयं); } – marcelnijman

+0

@marcelnijman हालांकि मैं समझता हूं कि आप 'UIViewController' श्रेणी के साथ क्या करने का प्रयास कर रहे हैं, यह सभी मामलों में काम नहीं करता है। उदाहरण के लिए, यह आपके ऐप के प्रारंभिक व्यू कंट्रोलर के लिए झूठी सकारात्मक लौटाएगा क्योंकि यह स्टैक के शीर्ष पर है। – memmons

0

Apple explains how the contacts application works under the hood:

setEditing:animated: विधि ओवरराइड एक कस्टम दृश्य नियंत्रक वर्ग दोनों प्रदर्शन और संपादित सामग्री के लिए इस्तेमाल किया जा करने की अनुमति के लिए,।

आपको मुफ्त में कुछ कार्यक्षमता मिलती है, उदा। Edit/Done बटन।

संबंधित मुद्दे