He estado buscando en internet para encontrar una solución. No hay nada que yo pudiera encontrar.
Así:
Estoy usando un UINavigationController. Estoy presionando dos UIViewControllers en ella. En la segunda empujado ViewController estoy de ejecutar este código:

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
NSLog([error localizedDescription]);
[self.navigationController popViewControllerAnimated:YES]; }

La espera cosa que podría ocurrir es que el último empujó ViewController desaparece. En esta aplicación estoy haciendo esto en algunos lugares y funciona bien en todas partes de esperar en este muy ViewController.
Lo que pasa es que sólo la parte de atrás del botón se apaga la pantalla (animado) pero todo lo demás queda en la pantalla. En la Salida de la Consola dos cosas aparecen cuando esta línea se ejecuta:

2011-03-14 16:32:44.580
TheAppXY[18518:207] anidada pop
la animación puede resultar dañada
barra de navegación

2011-03-14 16:32:53.507
TheAppXY[18518:207] el Acabado de un
navegación de transición en un inesperado
estado. Barra de navegación subvista árbol
puede corromperse.

Dos mensajes de error que no pude encontrar NINGUNA información sobre.
Estoy usando XCode 4 y el SDK de iOS 4.3. Tal vez alguien me puede ayudar con este problema.

  • Creo que lo he descubierto por mí mismo. Yo creo que es porque yo intente pop el controlador de vista demasiado temprano. Si el Reverso de Geocoder entregado una dirección (que se inicia en ViewDidLoad) y no se pudo, la vista no aparecen todavía, así que animado de estallar no funciona bien, obviamente. Me ha implementado el inicio de la Inversa de Geocoder en ViewDidAppear y todo parece estar funcionando bien. Novato error de más o de menos. Pero me pregunto de que no existe información para encontrar
  • Recientemente, me he encontrado con el mismo problema. La razón fue: -yo estaba tratando de pop controlador de vista de dos veces por error. se puede comprobar que este choque mediante el establecimiento de puntos de interrupción en push y pop de Vista de los controladores
InformationsquelleAutor Christoph | 2011-03-14

7 Comentarios

  1. 50

    Me encontré con una situación similar en mi código y el mensaje decía:

    anidada empuje de animación puede resultar dañado en la barra de navegación

    De terminar una navegación de transición en un estado inesperado. Barra de navegación subvista árbol >puede corromperse.

    Mi conclusión a este problema era que yo estaba empujando 2 visualización de controladores, uno tras otro en rápida sucesión y ambos fueron animados.

    En su caso, no parece que usted podría estar entrando vista varios de los controladores con la animación de una después de la otra.

    Por lo tanto, mientras que una vista es la fase de animación, usted no debe comenzar la animación en otro punto de vista.

    También me pareció que si he desactivado animación de un punto de vista, el mensaje de error desapareció.

    En mi caso fue un problema con el flujo de la lógica como yo no tenía la intención de empujar 2 vista de los controladores de una después de la otra. Uno estaba siendo empujado dentro del switch case logic y otro después de su final.

    Espero que esto ayude a alguien.

    • Que aquí la clave para mí fue: «… y ambos fueron animados.» Gracias!
    • ¿Tienes alguna recomendación para el manejo de situaciones donde usted desea hacer esto? Por ejemplo, yo veo esto mucho cuando me empuje un controlador de vista en la pila y, a continuación, muestro una UIAlertView. Todavía quiero mostrar tanto de ellos, yo prefiero que la Opinión de obtener inserta en la pila y, a continuación, la alerta de vista sin tener que implementar un montón de métodos de delegado.
    • Gracias, cuando me cambié a este Animated:YES a Animated:NO y llame a mi método pop en viewDidAppear resuelto el problema
    • no es una solución elegante, pero me deshice de este error por poner un 0.5 segundos de retraso en la segunda acción, como la configuración de la animación no a la primera popviewcontroller no funcionó para mí.
  2. 28

    Usted puede conseguir esto en cualquier momento que usted intente pop antes de viewDidAppear. Si se establece un indicador, a continuación, sólo tiene que marcar la bandera en viewDidAppear, usted no tendrá un problema.

    • Este parece ser el enfoque más seguro
  3. 12

    He creado una gota en el reemplazo para UINavigationController que va a la cola de animaciones para usted y para evitar este problema completamente.

    Agarrar de BufferedNavigationController

    • Hola andrew, ¿usted todavía a favor de la clase anterior? Por alguna razón no funciona para mí como se puede ver aquí: stackoverflow.com/questions/16634337/…
    • Véase también mi UINavigationControllerWithQueue respuesta a continuación, una alternativa
  4. 3

    He tenido este problema, también, y esto es lo que estaba causando el mío:

    1. En RootViewController, estoy usando varios UISegmentedControl objetos para determinar cual de los muchos puntos de vista para la carga siguiente.
    2. En que (sub/2) punto de vista, yo estaba haciendo estallar (mediante el botón «Atrás») de vuelta a RootViewController.
    3. En RootViewController, yo estaba manejando viewWillAppear a «reset» cada uno de mis UISegmentedControl objetos a un selectedSegmentIndex de -1 (lo que significa que ningún segmento se ve «obligado»).
    4. Que «reset» activa cada uno de mis UISegmentedControl objetos a despedir a sus asociados (y por separado) IBActions.
    5. Ya que no me manejo por parte de una «selección» de -1, tuve varios métodos de cocción al mismo tiempo, todos tratando de empujar un punto de vista diferente.

    Mi solución? Me apretó mi sentencias if…then y rescatados en la ejecución de cualquier código en mi UISegmentedControl IBActions cuando selectedSegmentIndex == -1.

    Todavía no estoy seguro de por qué me tienes «pop» de la animación de los errores y no un «push» de errores, pero al menos descubierto mi error y lo tengo solucionado!

    Espero que esto ayude a alguien más!

  5. 0

    sí, desafortunadamente, apple no sincronizar UINavigationController animaciones. Andrew solución es excelente, pero si usted no quiere para cubrir toda su funcionalidad, hay una solución más simple, reemplazar estos dos métodos :

    //navigation end event
    
    - ( void )  navigationController    : ( UINavigationController* ) pNavigationController 
                didShowViewController   : ( UIViewController*       ) pController 
                animated                : ( BOOL                    ) pAnimated
    {
    
        if ( [ waitingList count ] > 0 ) [ waitingList removeObjectAtIndex : 0 ];
        if ( [ waitingList count ] > 0 ) [ super pushViewController : [ waitingList objectAtIndex : 0 ] animated : YES ];
    
    }
    
    
    - ( void )  pushViewController  : ( UIViewController* ) pController 
                animated            : ( BOOL ) pAnimated
    {
    
        [ waitingList addObject : pController ];
        if ( [ waitingList count ] == 1 ) [ super pushViewController : [ waitingList objectAtIndex : 0 ] animated : YES ];
    
    }

    y crear un NSMutableArray variable de instancia llamada lista de espera, y listo.

    • Me tomó esta idea y la generalizó a trabajar también con popViewController* en la respuesta de abajo, UINavigationControllerWithQueue
  6. 0

    Este problema sucede conmigo cuando yo uso los storyboards. He cometido un error:
    Tengo un UIButton con una acción de performSegueWithIdentifier. Así que enlace el empuje segue con el Botón con el otro ViewController de modo que se produzca este problema.

    A resolver:
    Enlace en el botón de acción en UIButton y vincular el empuje pase entre dos ViewControllers.

  7. 0

    La combinación de MilGra y Andrés respuestas me dio algo que funciona de forma fiable y es una simple gota en el UINavigationController de reemplazo.

    Esta mejora en MilGra la respuesta para hacer que funcione con la empuja y cop, pero es más simple que la de Andrew BufferedNavigationController. (El uso de BufferedNavigationController yo era ocasionalmente conseguir transiciones que nunca se completa y sólo mostrar una pantalla en negro.)

    Todo esto parece no ser necesario en iOS8, pero todavía era necesario para mí en iOS7.

    @implementation UINavigationControllerWithQueue {
    NSMutableArray *waitingList;
    }
    -(void) viewDidLoad {
    [super viewDidLoad];
    self.delegate = self; //NOTE: delegate must be self!
    waitingList = [[NSMutableArray alloc] init];
    }
    # pragma mark - Overrides
    -(void) pushViewController: (UIViewController*) controller
    animated: (BOOL) animated {
    [self queueTransition:^{ [super pushViewController:controller animated:animated]; }];
    }
    - (UIViewController *)popViewControllerAnimated:(BOOL)animated {
    UIViewController *result = [self.viewControllers lastObject];
    [self queueTransition:^{ [super popViewControllerAnimated:animated]; }];
    return result;
    }
    - (NSArray*)popToRootViewControllerAnimated:(BOOL)animated {
    NSArray* results = [self.viewControllers copy];
    [self queueTransition:^{ [super popToRootViewControllerAnimated:animated]; }];
    return results;
    }
    # pragma mark - UINavigationControllerDelegate
    -(void) navigationController: (UINavigationController*) navigationController
    didShowViewController: (UIViewController*) controller
    animated: (BOOL) animated {
    [self dequeTransition];
    }
    # pragma mark - Private Methods
    -(void) queueTransition:(void (^)()) transition {
    [waitingList addObject:transition];
    if (waitingList.count == 1) {
    transition();
    }
    }
    -(void) dequeTransition {
    if (waitingList.count > 0) {
    [waitingList removeObjectAtIndex:0];
    }
    if (waitingList.count > 0) {
    void (^transition)(void) = [waitingList objectAtIndex:0];
    if (transition) {
    transition();
    }
    }
    }
    @end
    • Trabajó mucho en el simulador, pero no de forma fiable en el dispositivo, así que al final, no es un método recomendado.

Dejar respuesta

Please enter your comment!
Please enter your name here