2012-04-20 11 views
6

मेरे पास viewWillDisappear: में साफ़ करने के लिए कुछ कोड है, जिसे मैं केवल तब देखना चाहता हूं जब दृश्य मूल दृश्य नियंत्रक पर वापस जा रहा हो।isBeingDismissed दृश्य में सेट नहीं है WillDisappear:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    if ([self isMovingFromParentViewController] || [self isBeingDismissed]) { 
     NSLog(@"isMovingFromParentViewController or isBeingDismissed"); 
     // clean up 
    } 
    [super viewWillDisappear:animated]; 
} 

दृश्य को दो तरह से प्रस्तुत किया जा सकता: यह, या (एक ही नेविगेशन नियंत्रक से) एक मॉडल दृश्य नियंत्रक के रूप में प्रस्तुत एक नेविगेशन नियंत्रक द्वारा धक्का दिया जा सकता है। यदि इसे धक्का दिया जाता है, तो पॉप किया गया (बैक बटन दबाकर), मेरा क्लीन-अप कोड चलता है। यदि यह एक मोडल व्यू कंट्रोलर के रूप में प्रस्तुत किया जाता है, तो खारिज कर दिया जाता है, कोड नहीं चलता है।

मैं बहुत तरह खारिज:

[rootViewController dismissModalViewControllerAnimated:YES]; 

मेरा प्रश्न है: क्यों isBeingDismissed सेट जब मैं अपने दृश्य नियंत्रक को खारिज नहीं है?

उत्तर

3

आपकी समस्या यह है कि आप अपने मोडल व्यू को कैसे खारिज कर रहे हैं। RootViewController को परिभाषित कैसे किया जा रहा है?

जब मैं [self dismissModalViewControllerAnimated:YES] पर कॉल करता हूं तो [self isBeingDismissed] सत्य का मूल्यांकन करता है।

जब मैं [parentViewController dismissModalViewControllerAnimated:YES] पर कॉल करता हूं तो [self isBeingDismissed] सत्य का मूल्यांकन करता है, जिससे parentViewController UIViewController है जो मोडल व्यू प्रस्तुत करता है (नोट: एक UINavigationController नहीं)।

+3

मैं पुष्टि कर सकता है कि 'isBeingDismissed() 'रिटर्न' झूठा 'जब व्यू कंट्रोलर को' UINavigationController' से पॉप किया गया है, जैसे कि संक्षिप्त दृश्य 'UISplitViewController' में विस्तार दृश्य नियंत्रक। – bio

16

यदि यह एक मोडल नेविगेशन नियंत्रक में पहला दृश्य नियंत्रक है जिसे बर्खास्त किया जा रहा है, तो false से self.isBeingDimissed() पर कॉल किया जा रहा है।

हालांकि, चूंकि संपूर्ण नेविगेशन नियंत्रक को खारिज कर दिया जा रहा है, वास्तव में क्या काम करता है self.navigationController?.isBeingDismissed() है, जो true देता है।

0
 viewController.isBeingPresented == NO; 
     [rootVC presentViewController:viewController animated:NO completion:^{ 
      viewController.isBeingPresented == NO; 
      viewController.isBeingDismissed == NO; 
      [viewController dismissViewControllerAnimated:NO completion:^{ 
       viewController.isBeingDismissed == NO; 
      }]; 
      viewController.isBeingDismissed == NO; // is not work 
     }]; 
     viewController.isBeingPresented == YES;  // is work 
 viewController.isBeingPresented == NO; 
     [rootVC presentViewController:viewController animated:NO completion:^{ 
      viewController.isBeingPresented == NO; 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
       viewController.isBeingDismissed == NO; 
       [viewController dismissViewControllerAnimated:NO completion:^{ 
        viewController.isBeingDismissed == NO; 
       }]; 
       viewController.isBeingDismissed == YES; // is work 
      }); 
     }]; 
     viewController.isBeingPresented == YES;  // is work 
2

@Yuval ताल उल्लेख किया है, इस ध्वज जब आप नियंत्रक कि नेविगेशन नियंत्रक के अंदर embeded है खारिज कर रहे हैं काम नहीं करता।

extension UIViewController 
{ 
    var isAboutToClose: Bool { 
     return self.isBeingDismissed ||  
       self.isMovingFromParentViewController ||   
       self.navigationController?.isBeingDismissed ?? false 
    } 
} 

यह आसानी से जब आप किसी अन्य मामले में जब मानक .isBeingDismissed काम नहीं करेगा लगता है बढ़ाया जा सकता है: यहाँ एक विस्तार है कि मैं का उपयोग है। और यदि आप पाते हैं, तो हमें टिप्पणियों में बताएं।

0

कुछ मौका आप यहाँ आया एक गैर रीति से प्रस्तुत दृश्य नियंत्रक पर isBeingDismissed उपयोग करने के लिए कोशिश कर रहा द्वारा, आप हमेशा अपने navigationController की topViewController संपत्ति, उदाहरण के लिए जांच कर सकते हैं:

if navigationController?.topViewController != self { 
    return 
} 
संबंधित मुद्दे