2012-10-27 29 views
8

मैं Xcode 4.5 और iOS 6IOS 6 स्टोरीबोर्ड: मोडल दृश्य को खारिज नहीं कर रहा है

मैं एक सार्वभौमिक अनुप्रयोग है कि स्टोरीबोर्ड उपयोग कर रहा है निर्माण कर रहा हूँ उपयोग कर रहा हूँ। मेरे पास एक व्यू कंट्रोलर है जिसमें नेविगेशन बार में एक बटन है। जब बटन टैप किया जाता है, तो मैं एक दृश्य के रूप में एक और दृश्य नियंत्रक प्रस्तुत करने के लिए एक segue का उपयोग कर रहा हूँ। मोडल व्यू कंट्रोलर के पास नेविगेशन बार में एक रद्द करें और एक सेव बटन है। स्टोरीबोर्ड में, मोडल बटन आइटम नए पर क्रियाओं से जुड़े होते हैं एक्शन से बाहर निकलें जो कि पैरेंट व्यू कंट्रोलर को खोलने, मोडल को खारिज करने और एक एक्शन हैंडलर को कॉल करने के लिए माना जाता है।

यह आईफोन पर ठीक काम करता है, लेकिन मुझे आईपैड पर समस्याएं दिख रही हैं। आईपैड पर, जब मोडल पूर्ण स्क्रीन में प्रस्तुत किया जाता है, तो सबकुछ काम करता है। जब मैं मोड शीट या फॉर्म शीट में मोड बदलता हूं (जो मेरे मामले में वांछित व्यवहार है), तो एक्शन हैंडलर को कॉल किया जाता है, लेकिन मोडल व्यू कंट्रोलर स्वचालित रूप से खारिज नहीं किया जा रहा है।

क्या किसी और ने इस व्यवहार को देखा है? क्या ऐसा कुछ है जिसे आपने ठीक करने के लिए किया है?

धन्यवाद।

उत्तर

6

इस बारे में पूछने के लिए धन्यवाद, क्योंकि मुझे अभी भी एक ही समस्या का सामना करना पड़ा है। मुझे लगता है कि यह एक बग है, लेकिन मैंने अभी तक इसे ऐप्पल के साथ दायर नहीं किया है। इस बीच, आसान कामकाज dismissViewController:animated: को अपने unwind: कार्यान्वयन (यानी, बाहर निकलने वाले आइकन के माध्यम से अवांछित सेग्यू से जुड़ी कार्रवाई विधि में) को कॉल करना है, इस प्रकार मोडल व्यू को स्वयं को कम करना है।

इस समाधान के बारे में मेरी एकमात्र चिंता यह है कि यदि यह एक बग है और ऐप्पल अंततः इसे ठीक करता है, तो क्या उनके समाधान इस कार्यवाही का उपयोग करके किसी भी कोड को तोड़ देगा? केवल समय ही बताएगा ...

बाद में संपादित करें: मैंने बहुत अच्छा कामकाज खोजा है। उस वर्ग के अभिभावक (कंटेनर) वर्ग को उप-वर्ग करें जिसे आप खोलना चाहते हैं, और इसके बजाए वहां अनदेखा करें। उदाहरण के लिए, मेरे एप्लिकेशन में, स्थिति इस प्रकार है: ThirdViewController वापस DetailViewController करने से

UISplitViewController 
    UINavigationController 
     MasterViewController 
    UINavigationController 
     DetailViewController ----> modal segue ----> ThirdViewController 

बाहर निकलें/खोलना segue बग को दर्शाता है - unwind: कार्यान्वयन कहा जाता है, लेकिन रूप देखने को खारिज कर दिया नहीं है। लेकिन अगर मैं UISplitViewController को उपclass और unwind: लागू करता हूं, तो यह ठीक काम करता है। (unwind: कार्यान्वयन खाली हो सकता है; बिंदु यह है कि फ़ॉर्म व्यू स्वचालित रूप से खारिज कर दिया जाता है।) इसलिए स्पष्ट रूप से यह कंटेनर व्यू कंट्रोलर के साथ एक समस्या है, और आप कंटेनर को इसे संभालने के द्वारा इसे हल कर सकते हैं।

मेरी उदाहरण परियोजना, https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/ch19p561containerViewControllerStoryboard3Bug

+0

यह मेरे लिए काम किया। सही उत्तर के रूप में स्वीकार किया जाना चाहिए। – MiuMiu

4

कूल पर अपलोड दिखाई देता है तो मोडल दृश्य नियंत्रक स्वचालित रूप से बर्खास्त कर दिया गया है, लेकिन एप्पल के उदाहरण here में, वे segue के लिए एक मॉडल के लिए संक्रमण का उपयोग, लेकिन फिर स्पष्ट रूप से dismissViewControllerAnimated फोन: पूरा होने: में इसे खारिज करने के लिए कार्रवाई (बाहर निकलें) कार्रवाई करें।

2

मैं एक ही मुद्दा था, तो क्या मैंने किया था:

- (IBAction)closeSalesJournal:(UIStoryboardSegue *)segue 
{ 
    // Unwind Segue 
    NSLog(@"Closed Sales journal VC"); 

    // For iPad, need to dismiss the view controller manually 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
} 

इस तरह, मैं iPhone के लिए मानक तरीका छोड़ दो और iPad के साथ बर्खास्तगी के लिए मजबूर करने के लिए सुनिश्चित कर रहा हूँ।

0

मुझे इस तरह की एक ही समस्या थी। मेरा मोडल segue अनचाहे नहीं होगा। बहुत अधिक समय बर्बाद होने के बाद, मैंने समस्या का पता लगाया। वह मेरी गलती थी।

मेरे पास गंतव्य नियंत्रक में खराब लिखा गया - (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender था। यह उस नए सीगू की अपेक्षा नहीं कर रहा था जिसे मैंने अभी लिखा था, इसलिए यह NO लौटा रहा था। संक्षेप में, मेरे नए सेग्यू को कुछ अन्य कोड से मुक्त नहीं होने के लिए कहा जा रहा था।