2012-09-30 20 views
12

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

-(void) perform { 
    UIViewController *container = [self sourceViewController]; 
    UIViewController *child = [self destinationViewController]; 
    [container addChildViewController:child]; 
    [container.view addSubview:child.view]; 
    child.view.center = container.view.center; 
    [UIView transitionWithView:container.view 
         duration:0.35 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         child.view.alpha = 1; 
        } completion:^(BOOL finished) { 
         [child didMoveToParentViewController:container]; 
        }]; 
} 

कि पूरी तरह से काम करता है, लेकिन मैं इसे खोलना segue वापस कंटेनर नियंत्रक से प्रदर्शन नहीं कर सकते हैं: प्रदर्शन विधि इस तरह दिखता है। मैं viewControllerForUnwindSegueAction ओवरराइड: fromViewController: withSender: और सुनिश्चित करें कि यह सही मान लौटा रहा है:

-(UIViewController *) viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender { 
    id default = [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender]; 
    NSAssert1(default == self, @"Expected the default view controller to be self but was %@", default); 
    return default; 
} 

मैं भी कि canPerformUnwindSegueAction इस बात की पुष्टि कर सकते हैं: fromViewController: withSender कहा जाता है की जा रही है और सही काम करने के लिए, लेकिन होना निश्चित मैं इसे overrode हाँ लौटने के लिए

-(BOOL) canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender { 
    return YES; 
} 

अगले कदम मैं होने की उम्मीद करेंगे segueForUnwindingToViewController के लिए है: fromViewController: पहचानकर्ता: के नाम से जाना, लेकिन यह है कभी नहीं। इसके बजाय एप्लिकेशन एक NSInternalInconsistencyException के साथ दुर्घटनाग्रस्त हो जाता है।

2012-10-01 10:56:33.627 UnwindSegues[12770:c07] *** Assertion failure in -[UIStoryboardUnwindSegueTemplate _perform:], /SourceCache/UIKit_Sim/UIKit-2372/UIStoryboardUnwindSegueTemplate.m:78 
2012-10-01 10:56:33.628 UnwindSegues[12770:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not find a view controller to execute unwinding for <USCustomContainerViewController: 0x75949a0>' 
*** First throw call stack: 
(0x1c8e012 0x10cbe7e 0x1c8de78 0xb61f35 0x581711 0x45ab54 0x10df705 0x16920 0x168b8 0xd7671 0xd7bcf 0xd6d38 0x4633f 0x46552 0x243aa 0x15cf8 0x1be9df9 0x1be9ad0 0x1c03bf5 0x1c03962 0x1c34bb6 0x1c33f44 0x1c33e1b 0x1be87e3 0x1be8668 0x1365c 0x1e7d 0x1da5) 
libc++abi.dylib: terminate called throwing an exception 

क्या किसी ने सफलतापूर्वक दृश्य नियंत्रक रोकथाम API के साथ संयुक्त सेग का उपयोग किया है? कोई विचार है कि मैं किस चरण में लापता हूं? मैंने demo project to github अपलोड किया है जो कि सबसे सरल प्रदर्शन प्रोजेक्ट में समस्या को दिखाता है जिसके साथ मैं आ सकता हूं।

+0

संदर्भ के लिए: http://openradar.appspot.com/radar?id=2144402 –

उत्तर

2

यह एक बग प्रतीत होता है - मैं यह भी उम्मीद करता हूं कि आपके द्वारा कार्यान्वित किए जाने पर सीगू को काम करने के लिए खोलें।

वैकल्पिक हल है कि मैं प्रयोग किया जाता है स्पष्ट रूप से IBAction विधि में प्रस्तुत दृश्य नियंत्रक को खारिज किया जाता है:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController 
             fromViewController:(UIViewController *)fromViewController 
               identifier:(NSString *)identifier 
{ 
    return [[UIStoryboardSegue alloc] initWithIdentifier:identifier 
               source:fromViewController 
              destination:toViewController]; 
} 

- (IBAction)unwind:(UIStoryboardSegue*)segue 
{ 
    UIViewController *vc = segue.sourceViewController; 
    [vc willMoveToParentViewController:nil]; 
    if ([vc respondsToSelector:@selector(beginAppearanceTransition:animated:)]) { 
     [vc beginAppearanceTransition:NO animated:YES]; // iOS 6 
    } 
    UIView *modal = vc.view; 
    UIView *target = [[segue destinationViewController] view]; 
    [UIView animateWithDuration:duration animations:^{ 
     modal.frame = CGRectMake(0, target.bounds.size.height, modal.frame.size.width, modal.frame.size.height); 
    } completion:^(BOOL finished) { 
     [modal removeFromSuperview]; 
     [vc removeFromParentViewController]; 
     if ([vc respondsToSelector:@selector(endAppearanceTransition)]) { 
      [vc endAppearanceTransition]; 
      } 
    }]; 
} 
5

अपने उदाहरण में समस्या कोई वहाँ नहीं है कि है। यह भी सरल है। सबसे पहले, आप अपने कंटेनर व्यू कंट्रोलर को एक अजीब तरीके से बनाते हैं (आप नए आईबी "कंटेनर व्यू" का उपयोग नहीं करते हैं जो आपको ऐसा करने में मदद करने के लिए है)। दूसरा, आपके पास कुछ भी नहीं है: कुछ भी शीर्ष पर धक्का या प्रस्तुत नहीं किया गया था।

मेरे पास एक कामकाजी उदाहरण है जो दिखाता है कि canPerformUnwindSegueAction वास्तव में मूल श्रृंखला से परामर्श किया जाता है, और viewControllerForUnwindSegueAction और segueForUnwindingToViewController सही जगह पर मौजूद होने पर प्रभावी और प्रभावी होते हैं। देखें:

https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/ch19p640presentedViewControllerStoryboard2

मैं अब भी GitHub पर अपने मूल उदाहरण के एक कांटा बनाया है, यह सही करने इतना है कि यह इन सुविधाओं दिखाता है:

https://github.com/mattneub/UnwindSegues

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

+0

मुझे लगता है कि लिंक https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/ होना चाहिए ch19p640presentedViewControllerStoryboard2 मैंने इसे संपादित करने का प्रयास किया, लेकिन SO मुझे संपादित नहीं करेगा क्योंकि संपादन 6 वर्णों से कम है – combinatorial

+0

मैं इसे ठीक कर दूंगा; चेतावनी देने के लिए आपका धन्यवाद। – matt

+4

बहुत बुरा लिंक मर चुका है! मुझे वास्तव में समाधान की आवश्यकता है ... –

2

उत्तर से पहले संक्षिप्त इतिहास: आईओएस 6 में एक आईपैड स्क्रीन पर एकाधिक कंटेनर दृश्यों का उपयोग करने और कोड से अनजान सेगमेंट को कॉल करने का प्रयास करते समय मैं एक ही सटीक त्रुटि संदेश में भाग गया।सबसे पहले मैंने सोचा कि यह एक समस्या हो सकती है क्योंकि मेरे सीगू को कुछ यूआई नियंत्रण से बाहर निकलने के बजाय फ़ाइल स्वामी से बाहर निकलने के लिए CTRL-dragging द्वारा स्टोरीबोर्ड का उपयोग करके बनाया गया था, लेकिन जब मैं परीक्षण करता हूं तो प्रत्येक वीसी पर बंद बटन बंद करते हैं और मुझे वही परिणाम मिलते हैं वे अवांछित segues ट्रिगर। मुझे एहसास हुआ कि मैं एक एम्बेडेड सेग्यू को खोलने की कोशिश कर रहा हूं, न कि एक मोडल/पुश/पॉपअप सेग्यू, इसलिए यह समझ में आता है कि यह ऐसा करने में विफल रहता है। आखिरकार, अगर अनइंड सेग्यू सफल होता है और व्यू कंट्रोलर को कंटेनर व्यू से अनलोड किया जाता है, तो आईओएस 6 सोचता है कि उस स्थान पर स्क्रीन पर बस खाली जगह होगी। (मेरे मामले में, मेरे पास एक और कंटेनर दृश्य है जो स्क्रीन रीयल एस्टेट ले रहा है जो कंटेनर व्यू के पीछे दिखाया गया है जिसे मैं अनलोड करने की कोशिश कर रहा हूं, लेकिन आईओएस यह नहीं जानता कि चूंकि दोनों किसी भी तरह से जुड़े नहीं हैं।)

उत्तर: इससे मुझे एहसास हुआ कि आप केवल मोडल, पुश या पॉपओवर सेग्स को खोल सकते हैं, चाहे वह मुख्य विंडो में हों या नेविगेशन/टैब कंट्रोलर के हिस्से के रूप में हो। यह बी/सी आईओएस है तो जानता है कि पिछली स्क्रीन के लिए पिछली वीसी जिम्मेदार थी और इसे वापस जाने के लिए सुरक्षित है। तो, आपके मामले में, मैं आईओएस को बताने का एक तरीका देखता हूं कि आपके बच्चे के कंटेनर व्यू आपके माता-पिता के कंटेनर व्यू से इस तरह से जुड़ा हुआ है जिससे बच्चे के कंटेनर व्यू को खारिज कर दिया जा सके। उदाहरण के लिए, बच्चे कंटेनर व्यू को प्रदर्शित करते समय एक मोडल/पुश/पॉपओवर सेग्यू करें, या दोनों कस्टम यूआईएनएविगेशन कंट्रोलर क्लास में लपेटें (मुझे लगता है कि आप नेविगेशन बार नहीं चाहते हैं, यही कारण है कि कस्टम क्लास)।

क्षमा करें मैं सटीक कोड नहीं दे सकता, लेकिन यह अब तक का सबसे अच्छा है और मुझे आशा है कि यह सहायक होगा।

0

ऐसा लगता है कि यह बग आईओएस 9 में तय है।

+0

यह टिप्पणी होना चाहिए। –

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