2012-09-04 32 views
19

Estoy trabajando en iOS 6. Mi aplicación tiene un controlador de navegación estándar con un CustomViewController incorporado. En este controlador que crea una vista modal de la siguiente manera:Advertencia extraña que descarta el controlador de vista modal

-(IBAction)presentModalList:(id)sender { 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
    StationsListViewController *list = [storyboard instantiateViewControllerWithIdentifier:@"StationsListViewController"]; 
    [list setStationsData: [self.stationsData allValues]]; 
    [self presentModalViewController:list animated:YES]; 
} 

El espectáculo controlador modal perfectamente pero el despido genera una advertencia. El método descartar en este controlador es:

-(IBAction)backToMap 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

La advertencia se genera Advertencia:

intento de apartar de controlador de vista < UINavigationController: 0x1ed91620> mientras que una presentación o desestimar está en marcha!

¿Alguna pista sobre eso?

Gracias

+0

Relacionados - http: // stackoverflow. com/questions/1412021/iphone-crashing-when-present-modal-view-controller – ChrisF

Respuesta

28

Comprendo que esto es una respuesta tardía, pero tal vez esto ayude a alguien más en busca de una solución a esto, esto es lo que hice:

-(IBAction)backToMap 
{ 
    if (![[self modalViewController] isBeingDismissed]) 
     [self dismissModalViewControllerAnimated:YES]; 
} 

para mí, me encontré con que la línea de código fue llamado varias veces, no pude averiguar por qué, así que esta fue la solución más fácil.

+6

También encontré este problema. Lo que puede estar sucediendo es que su llamada 'dimissModalViewControllerAnimated:' se puede colocar en un método de devolución de llamada (IBAction) que se desencadena (directa o indirectamente) presionando el botón Cancelar en la vista modal, que ya maneja el descartar la vista modal. Así que este 'dismissModalViewControllerAnimated:' puede ser un duplicado y se puede eliminar. – smileyborg

+1

Tuve un problema similar, pero fue causado por la presentación de viewController, y luego fue descartado casi de inmediato (así que descartarlo fue durante la animación actual). Así que tuve que verificar 'isBeingPresented'. – Olie

+0

Es extraño.Creo que @smileyborg está en algo. Pero no veo por qué está descartando aparentemente automáticamente? Todo lo que hice fue una acción de recuperación, y no necesito despedirlo directamente. – huggie

14

Gracias JDx por ponerme en el camino correcto. Lo adapté para formar esta solución, lo que eliminará la advertencia sin utilizar funciones que están en desuso en IOS 6:

-(IBAction)backToMap 
{ 
    if (![self.presentedViewController isBeingDismissed]) { 
     [self dismissViewControllerAnimated:YES completion:^{}]; 
    } 
} 
0

He encontrado que este enfoque es poco fiable - por ejemplo un caso en cinco yo todavía veo el error .

Mi solución fue utilizar el bloque de finalización para establecer un indicador que controla si es seguro descartar o no, de esa manera no es necesario comprobar si la vista se descarta o no.

-(IBAction)presentModalView:(id)sender { 
    : 
    self.canDismiss = NO; 
    [self presentViewController:aVC animated:YES completion:^{ 
     self.canDismiss = YES; 
    }]; 
    : 
} 

En el fragmento de código en el que el despedir ocurre, simplemente marque la bandera:

-(void)dismisser { 
    : 
    if (self.canDismiss) { 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
    : 
} 

¡listo, no más errores!

0

Orientación iOS6, esto es lo que funcionó para mí:

if (![self.presentedViewController isBeingDismissed]) 
    [self.presentedViewController dismissViewControllerAnimated:YES 
                completion:nil]; 
0

Puede hacer lo que quiera después de la finalización del método descartar como:

-(IBAction)backToMap 
{ 
    [self dismissViewControllerAnimated:YES 
          completion:^{ 
           //Do something here 
          }]; 
} 
Cuestiones relacionadas