2012-04-20 9 views
6

Tengo un código para limpiar en mi viewWillDisappear:, que solo quiero usar cuando la vista se mueva de regreso al controlador de vista padre.isBeingDismissed no configurado en viewWillDisappear:

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

La vista se puede presentar en dos formas: puede ser empujado por un controlador de navegación, o presenta como un controlador de vista modal (desde el mismo controlador de navegación). Si se presiona, luego aparece (presionando el botón Atrás), se ejecuta mi código de limpieza. Si se presenta como un controlador de vista modal, luego se descarta, el código no se ejecuta.

me despido de este modo:

[rootViewController dismissModalViewControllerAnimated:YES]; 

Mi pregunta es: ¿por qué no es isBeingDismissed set cuando me despido de mi controlador de vista?

Respuesta

3

Su problema es cómo está descartando su vista modal. ¿Cómo se define rootViewController?

Cuando llamo a [self dismissModalViewControllerAnimated:YES], entonces [self isBeingDismissed] se evalúa como verdadero.

Cuando llamo a [parentViewController dismissModalViewControllerAnimated:YES], entonces [self isBeingDismissed] se evalúa como verdadero, donde parentViewController es el UIViewController que presentó la vista modal (nota: no es un UINavigationController).

+3

puedo confirmar que 'isBeingDismissed() 'devuelve' false' cuando el control de vista supuestamente aparece desde un 'UINavigationController', como el detalle viewController en un' UISplitViewController' colapsado. – bio

16

Si este es el primer controlador de vista en un controlador de navegación modal que se está descartando, llamando al self.isBeingDimissed() desde viewWillDisappear: devuelve false.

Sin embargo, dado que se está descartando todo el controlador de navegación, lo que realmente funciona es self.navigationController?.isBeingDismissed(), que devuelve 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

Como se mencionó @Yuval Tal, esta bandera no funciona cuando se está despidiendo controlador que está embebido dentro de mando de navegación. Aquí está una extensión que utilizo:

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

se puede ampliar fácilmente cuando se encuentre otro caso cuando .isBeingDismissed estándar no funcionará. Y si encuentra, permítanos, hágamelo saber en los comentarios.

0

Si por alguna casualidad usted vino aquí tratando de utilizar isBeingDismissed en un controlador de vista no-modal presentado, siempre se puede comprobar la propiedad topViewController de su navigationController, por ejemplo:

if navigationController?.topViewController != self { 
    return 
} 
Cuestiones relacionadas