es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Llamar a [UINavigationController pushViewController:animated:] no realiza ninguna operación y desencadenará otro pushViewController.

Actualmente estoy trabajando en la siguiente situación, necesito empujar dos viewController (A y B) en secuencia en poco tiempo.

Esto es lo que hago:
1. Primero llamo a [UINavigationController pushViewController:vcA animated:YES]
2. En [navigationController:(UINavigationController*)navigationController didShowViewController:(UIViewController*)viewController animated:(BOOL)animated], llamo a [UINavigationController pushViewController:vcB animated:YES]

Dado que he anulado algunas funciones en [UINavigationController pushViewController:animated], quiero que [UINavigationController pushViewController:animated] solo se active dos veces, una al empujar vcA y otra al empujar vcB.

Sin embargo, la situación actual es que [UINavigationController pushViewController:animated] se activa tres veces:
1. La primera vez cuando llamamos a [UINavigationController pushViewController:vcA animated:YES]
2. La segunda vez cuando llamamos a [UINavigationController pushViewController:vcB animated:YES]. Sin embargo, esto es extraño porque en este punto no está haciendo nada. Verifiqué NavigationController.viewControllers y encontré que vcB no se había empujado.
3. La tercera vez, [UINavigationController pushViewController:vcB animated:YES] se activa de nuevo, y es activado por [_UIViewControllerTransitionCoordinator _applyBlocks:releaseBlocks:], la traza completa se puede ver aquí.

Entonces, mi pregunta es, ¿de dónde proviene la tercera [UINavigationController pushViewController:vcB animated:YES]? Estoy seguro de que no he anulado ningún _UIViewControllerTransitionCoordinator.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basado en la traza de la pila, la tercera llamada a [UINavigationController pushViewController:vcB animated:yes] es desencadenada por _UIViewControllerTransitionCoordinator. Esto es probablemente debido al hecho de que estás intentando añadir vcB mientras la pila de navegación todavía está en proceso de animar la transición a vcA.

    Para asegurarte de que [UINavigationController pushViewController:vc:animated:] solo se llama dos veces, podrías intentar lo siguiente:

    1. Establece un indicador de tipo BOOL para indicar que la primera operación de añadir está completa.
    2. En el callback navigationController:didShowViewController:animated:, verifica el indicador antes de intentar añadir vcB. Si el indicador está establecido, procede con la operación de añadir. Si no, espera a que la animación esté completa y luego añade vcB.

    Aquí tienes un ejemplo de código para ilustrar:

    // Configura tus controladores de vista
    UIViewController *vcA = [[UIViewController alloc] init];
    UIViewController *vcB = [[UIViewController alloc] init];
    
    // Establece un indicador de tipo BOOL para indicar si la primera operación de añadir está completa o no
    BOOL primeraOperacionCompleta = NO;
    
    // Añade vcA
    [self.navigationController pushViewController:vcA animated:YES];
    
    // En el callback navigationController:didShowViewController:animated:
    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        // Si el controlador de vista actual es vcA y la primera operación de añadir aún no está completa...
        if (viewController == vcA && !primeraOperacionCompleta) {
            // Establece el indicador para indicar que la primera operación de añadir está completa
            primeraOperacionCompleta = YES;
    
            // Añade vcB
            [self.navigationController pushViewController:vcB animated:YES];
        }
    }
    

    De esta manera, puedes asegurarte de que se llama a [UINavigationController pushViewController:vcB animated:yes] solo dos veces y que la segunda operación de añadir no se intenta hasta que la primera esté completa.

Comments are closed.