2012-03-16 14 views
32

सेटअप: मेरे पास एक स्टोरीबोर्ड सेट है, जिसमें दो सरल दृश्य नियंत्रक ए और बी हैं। ए में एक बटन है, जो एक मोडल सेग्यू के साथ बी में संक्रमण करता है। बी को ए के शीर्ष पर एक मोडल संक्रमण के साथ प्रस्तुत किया जाता है। यह ठीक है।एक मॉडल segue के साथ एक UIStoryboard में प्रस्तुत एक मॉडल को खारिज कैसे करें?

प्रश्न: क्या बी को दूर करने और कुछ सरल स्टोरीबोर्ड जादू के साथ वापस आने का कोई तरीका है?

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

पर जाने के लिए सिग्नल करने के लिए उपयोग कर सकता हूं अब बिल्ड करने के लिए पुरानीस्कूल विधि एक को तो B से वापस जा रहा होगा: इस:

  • सेट एक बी पर एक प्रतिनिधि संपत्ति बनाने के बी के प्रतिनिधि होने के लिए जब मोडल संक्रमण segue वापस निभाता है (मैं में इस का उपयोग कर prepareForSegue हुक कर सकते हैं एक में कोड)
  • जब इसे खारिज करने का समय है, बी अपने प्रतिनिधि
  • पर संकेत करता है
  • ए एक प्रतिनिधि विधि लागू करता है जो बी

यह काम करता है, लेकिन बहुत अधिक ओवरहेड और मूर्खतापूर्ण लगता है।

क्या कुछ यूआईएसटीरीबोर्ड मैकेनिक है जिसे मैंने याद किया है, जो मूल रूप से "रिवर्स मोडल सेग्यू" करेगा?

उत्तर

44

कम से कम थोड़ा सा कोड लिखने के बिना एक मोडल व्यू कंट्रोलर को खारिज करने के लिए कोई स्टोरीबोर्ड जादू नहीं है।

लेकिन जब आपको अपने स्वयं के कुछ कोड को लागू करना होता है, तो आपको जरूरी नहीं कि उस परेशानी पर जाना पड़े। आपके पास केवल नियंत्रक बी में एक बटन हो सकता है जो [self dismissViewControllerAnimated:YES completion:nil] पर कॉल करता है। (दस्तावेज़ों का कहना है कि प्रेजेंटिंग व्यू कंट्रोलर को खारिज करने वाला एक होना चाहिए, लेकिन वे यह भी कहते हैं कि प्रस्तुतकर्ता को बुलाए जाने पर संदेश प्रस्तुत करने वाले व्यू कंट्रोलर को भेजा जाएगा। यदि आप इसके बारे में अधिक स्पष्ट होना चाहते हैं - और आप ' कुछ मामलों में होना चाहिए, जैसे कि जब एक मोडल व्यू कंट्रोलर दूसरे से प्रस्तुत किया जाता है - आप स्पष्ट रूप से प्रस्तुति को self.presentingViewController के साथ संदर्भित कर सकते हैं और वहां से dismiss... पर कॉल कर सकते हैं।)

आप कुछ ऐप्स में प्रतिनिधि व्यवसाय देखते हैं क्योंकि यह एक है व्यू कंट्रोलर को सूचित करने का तरीका ए कंट्रोलर बी को देखते हुए उपयोगकर्ता ने जो कुछ भी किया था ... लेकिन यह एकमात्र तरीका नहीं है। self.presentingViewController के साथ संदर्भित करने के बाद केवीओ, नोटिफिकेशन, या सिर्फ सादा कॉलिंग ए के तरीकों के बारे में है (माना जाता है कि बी जानता है कि यह हमेशा ए द्वारा प्रस्तुत किया जा रहा है)। और यदि ए को बी में क्या हुआ है, इसके बारे में जानने की आवश्यकता नहीं है (कहें, क्योंकि उपयोगकर्ता ने एक रद्द बटन दबाया है), इसमें से कोई भी करने की आवश्यकता नहीं है - आप केवल मोडल को खारिज कर सकते हैं और इसके साथ किया जा सकता है।


iOS 6 में और बाद में, segues एक और विकल्प जोड़ने तनाव कम, मोडल दृश्य नियंत्रक खारिज के लिए "स्टोरीबोर्ड जादू" का एक छोटा सा प्रदान करने (या अन्य प्रकार segues के अनुक्रम का "बाहर समर्थन")। लेकिन इस दृष्टिकोण को अभी भी कुछ कोड की आवश्यकता है - आप इसे पूरी तरह से स्टोरीबोर्ड में सेट नहीं कर सकते हैं। प्लस तरफ, हालांकि, वह कोड दृश्य नियंत्रक से जानकारी प्राप्त करने के लिए पथ प्रदान करता है (बी) जिसे इसे प्रस्तुत किया गया है (ए)।

एप्पल a tech note about unwind segues है कि उन्हें विस्तार से शामिल किया गया है, लेकिन यहाँ है लघु संस्करण:

  1. दृश्य नियंत्रक वर्ग आप को तनाव कम करना चाहते हैं पर एक IBAction विधि परिभाषित करें - एक है कि एक मॉडल प्रस्तुत करता है नियंत्रक देखें, न कि मोडल व्यू कंट्रोलर स्वयं (अपने प्रश्न में नियंत्रक ए देखें)। सामान्य IBAction विधियों के विपरीत, इन्हें UIStoryboardSegue * प्रकार का पैरामीटर लेना चाहिए; जैसे

    - (IBAction)unwindToMainMenu:(UIStoryboardSegue*)sender 
    
  2. प्रस्तुत दृश्य नियंत्रक (प्रश्न में बी), तार हरे निकास आइकन के लिए एक नियंत्रण में, और विधि आप परिभाषित चुनें।

  3. आपके अनदेखी विधि कार्यान्वयन में, आप दृश्य नियंत्रक से जानकारी को पुनर्प्राप्त करने के लिए सेग्यू के sourceViewController का संदर्भ ले सकते हैं। आपको dismissViewControllerAnimated:completion: पर कॉल करने की आवश्यकता नहीं है क्योंकि segue दूर जाने वाले दृश्य नियंत्रक को खारिज कर देता है।

+0

कूल, प्रस्तुत करने वाले व्यू कंट्रोलर (स्पष्ट रूप से एक नई आईओएस 5 चीज) के बारे में नहीं पता था, जो मदद करता है। – Jaanus

+2

हाँ यदि आप इसे आसानी से पुन: उपयोग के लिए कस्टम सीगू में बनाना चाहते हैं तो आप कुछ ऐसा कर सकते हैं - (शून्य) { UIViewController * src = (UIViewController *) self.sourceViewController; [src.presentingViewController dismissModalViewControllerAnimated: YES]; } – AppHandwerker

+0

@ सिमोनएच segues के बारे में सलाह का सबसे अच्छा टुकड़ा! –

30

वहाँ स्टोरीबोर्ड जादू इस लक्ष्य को हासिल किया जा सके। यह एक अनजान segue के रूप में जाना जाता है। ए की .h फ़ाइल में आप जो कुछ भी "लक्ष्य कार्रवाई" शैली विधियों को लागू करते हैं, उन्हें लागू करने के लिए आपको बहुत सी जरूरतों को अनदेखा करते हैं। एक मॉडल के लिए, यह आमतौर पर दो (रद्द करें और सहेजें) है। तो मेरी आह फ़ाइल में मैं जोड़ना होगा:

// A.h file 
- (IBAction)myCancelUnwindSegueCallback:(UIStoryboardSegue *)segue; 
- (IBAction)mySaveUnwindSegueCallback:(UIStoryboardSegue *)segue; 

अब, अपने स्टोरीबोर्ड में, अगर आप से एक बी करने के लिए अब आप अपने को रद्द/बचाने के बटन से एक "लक्ष्य कार्रवाई" शैली नियंत्रण खींचें कर सकते हैं एक segue है बी में अपने स्टोरीबोर्ड में बी नियंत्रक के नीचे हरे "बाहर निकलें" आइकन पर। जब आप ऐसा करते हैं, तो एक्सकोड हमारे द्वारा बनाई गई दो विधियों को उठाएगा (क्योंकि वे ए के हेडर फ़ाइल में हैं और उनके पास सही हस्ताक्षर है (उदाहरण के लिए IBAction और UIStoryboardSegue *।) और बी ए से एक सेग का गंतव्य है) तो, ये लो। आपके पास स्टोरीबोर्ड जादू है जिसे आप ढूंढ रहे थे!

// A.m file 
- (IBAction)myCancelUnwindSegueCallback:(UIStoryboardSegue *)segue { 
    UIViewController *modalGoingAway = segue.sourceViewController; 
    // Do something (like get data) from modalGoingAway if you need to... 
} 

- (IBAction)mySaveUnwindSegueCallback:(UIStoryboardSegue *)segue { 
    UIViewController *modalGoingAway = segue.sourceViewController; 
    // Do something (like get data) from modalGoingAway if you need to... 
} 

अन्त में, इस दृष्टिकोण अपनी आवश्यकताओं को पूरा करते हैं, महान:

दो कॉलबैक के कार्यान्वयन में, आप के रूप में कुछ इस तरह होगा। हो गया। हालांकि, मैं अभी भी पूरे प्रोटोकॉल प्रतिनिधि/डेटा स्रोत डिजाइन पैटर्न को "रद्द करने" या "सहेजने पर" तार करता हूं, मैं दृश्य पदानुक्रम से बी को हटाने के लिए ए पर नियंत्रण पास करने से पहले बी के निजी गुणों पर कुछ संचालन करना चाहता हूं।

+1

कृपया 2 बातें ध्यान दें लक्ष्य। यह थोड़ा उलझन में है क्योंकि पुराने लक्ष्य के साथ आपको हरे रंग का निकास बटन दिखाई देगा जो अर्थहीन है) –

+1

यह वास्तव में पूर्ण "स्टोरीबोर्ड जादू" नहीं है क्योंकि आपको अभी भी अपने ए व्यू कंट्रोलर में कोड जोड़ना है। लेकिन मेरे मामले में, बी सिर्फ स्थिर सामग्री है, इसलिए यह बी को देखने के लिए बस बी व्यू कंट्रोलर सबक्लास बनाने के लिए धड़कता है। – jab

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