Estoy usando la navegación basada en la aplicación. Empujo Primera ViewController a Segunda ViewController y a partir de la Segunda ViewController a Tercera ViewController. Ahora quiero pop de Terceros ViewController a Primera ViewController.Estoy realizando esta tarea utilizando el código de abajo, pero mi aplicación se estrelló.

Por favor, cualquier cuerpo que me dan algunas pautas apropiadas. No puedo usar el pop a rootViewController porque es diferente viewController. Gracias de antemano…

En Tercer ViewControler he escrito esta:

FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil];
[self.navigationController popToViewController:x animated:NO];
InformationsquelleAutor Ankit Vyas | 2010-06-12

15 Comentarios

  1. 92

    Por Escrito la Primera Línea de obtener los Índices de todas las Vistas y Controladores de segunda Línea que Usted va a llegar a su Destino.

    NSArray *array = [self.navigationController viewControllers];
    
    [self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];
    • eso es increíble. +1 .. brillante. estoy usando esto en mi app ahora.
    • Gracias por la apreciación
    • O, por el forro de engañar a la gente: [auto.navigationController popToViewController:[[auto.navigationController viewControllers]objectAtIndex:2] animadas:YES];
    • Funciona gracias a una gran cantidad +1 🙂
  2. 75

    Un acercamiento más seguro:

    - (void)turnBackToAnOldViewController{
    
        for (UIViewController *controller in self.navigationController.viewControllers) {
    
            //Do not forget to import AnOldViewController.h
            if ([controller isKindOfClass:[AnOldViewController class]]) { 
    
                [self.navigationController popToViewController:controller
                                                      animated:YES];
                return;
            }
        }
    }
    • Más seguro que un método nativo? ¿Cómo es eso?
    • El método nativo es el mensaje popToViewController:animadas, y no de la manera que usted está proporcionando los parámetros para el mensaje. Creo que esta solución es más seguro porque cuando usted dice [matriz objectAtIndex:2] , se asume automáticamente que el número de VC es mayor que 2. Si eso no es el caso, el programa se bloquea, con mi solución va a estar quieto y no se cuelga si no hay ninguna instancia de la VC.
    • creo que tu planteamiento es realmente mejor que la solución aceptada @YunusNedimMehel. Lo que sea, y totalmente offtopic, creo que romper frase, no es necesario, no
    • Es realmente relevante, que vamos a discutir eso. No lo he probado, pero si el bucle no termina después de estallar, podría causar un accidente. Lo que si hay es otro ejemplo de AnOldViewController en la pila?
    • ive no probado demasiado, pero creo que, cuando popviewcontroller se llama, la vista actual del controlador se cancela la asignación (y creo que el hilo principal de operaciones, debe ser detenido)
    • Todavía es arriesgado, aunque, debido a la parte superior viewController se desasignan tras estallar animación se ha completado (0,3 s supongo?). Así que es mejor evitar que
    • estás en lo correcto.
    • Sí, esta es la mejor solución, a continuación, la aceptó responder… es dinámico, donde en respuesta contiene código estático…
    • vamos a suponer AnOldViewController no hay en la pila de navegación incluso desea que aparezca en la AnOldViewController. Cómo va a implementar esto?
    • Si no está en la pila, no pueden aparecer en él. Usted puede empujar, o insertar manualmente dentro de la viewControllers de la pila (es un público, readwrite NSArray de la propiedad)

  3. 15

    Swifty manera:

         let dashboardVC = navigationController!.viewControllers.filter { $0 is YourViewController }.first!
         navigationController!.popToViewController(dashboardVC, animated: true)
  4. 7
    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
  5. 6

    A menudo es más importante hacer que desde la parte superior de la pila, así:

    - (void)popToLast:(Class)aClass
    {
        for (int i=self.navigationController.viewControllers.count-1; i>=0; i--)
        {
            UIViewController *vc = self.navigationController.viewControllers[i];
            if ([vc isKindOfClass:aClass])
            {
                [self.navigationController popToViewController:vc animated:YES];
                break;
            }
        }
    }

    y llamar a que

    popToLast:[SomeViewController class];
    • no trabajo en ios8
  6. 5
    - (void) RetunToSpecificViewController{
    
       for (UIViewController *controller in self.navigationController.viewControllers)
        {
               if ([controller isKindOfClass:[AnOldViewController class]])
               {
                //Do not forget to import AnOldViewController.h
    
                           [self.navigationController popToViewController:controller
                                                                 animated:YES];
                            break;
                }
        }
    }
  7. 2

    Rápida y segura Swift 3 versión:

    if let vc = navigationController.viewControllers.filter({ $0 is SpecificViewControllerClass }).first {
      navigationController.popToViewController(vc, animated: true)
    }
  8. 1

    Su código crea una nueva instancia de una vista que nunca ha sido empujada a la pila, a continuación, intenta pop de nuevo a ese controlador.

    Si usted está apareciendo de nuevo a la raíz de controlador de vista, se puede utiliza popToRootViewControllerAnimated:

    Si usted está haciendo estallar hacia atrás una distancia conocida puede llamar popViewControllerAnimated: más de una vez. En tu ejemplo, que sería de 2 controladores para las llamadas. Usted podría hacer lo mismo buscando en viewControllers para el controlador 2 en la final y hacer estallar a ella.

    Las sugerencias anteriores son soluciones rápidas. Una buena práctica sería la situación para pasar el controlador que desea devolver a lo largo de cada una de las sucesivas controlador de empuje. Pasa primero a sí mismo a segunda, segunda pasa que la referencia a la tercera, la tercera cop al pasar de referencia, que es el primero.

    En efecto, usted está creando un root temporal controlador. Usted podría subclase UINavigationController y agregar un temporaryRoot de la propiedad y un popToTemporaryRootViewControllerAnimated: método que haría estallar a su root temporal y clara. Cuando primero lleva segundos, también se fijó como el root temporal, de modo que cada controlador en la pila no tiene que pasar una referencia a su alrededor. Habría que añadir algo más de cheques seguro de que nunca pop allá de la temporaryRoot sin eliminarla.

    • He RootViewController luego es Empujado en FirstViewController, a continuación, después de SecondViewController, a continuación, después de ThirdViewController mientras yo llegar hasta ThirdViewController yo requerido pop Directamente a la FirstViewController.
  9. 1

    Después de un montón de esfuerzo que alguien ha creado swift extensión de la espalda a un particular punto de vista controlador en Swift 3.0.

    extension UINavigationController {
    
        func backToViewController(viewController: Swift.AnyClass) {
    
                for element in viewControllers as Array {
                    if element.isKind(of: viewController) {
                        self.popToViewController(element, animated: true)
                    break
                }
            }
        }
    }

    De llamada al método:

     self.navigationController?.backToViewController(viewController: YourViewController.self)
  10. 1

    Implementado & Probado en Swift 3.0

    A continuación es el Método que puede ser útil para Navegar a cualquier Controlador de Vista :

    func poptoSpecificVC(viewController : Swift.AnyClass){
            let viewControllers: [UIViewController] = self.navigationController!.viewControllers
            for aViewController in viewControllers {
                if aViewController.isKind(of: viewController) {
                    self.navigationController!.popToViewController(aViewController, animated: true)
                    break;
                }
            }
        }

    Uso :

    self.poptoSpecificVC(viewController: createIntervalVC.self)
  11. 1

    Creo que .filter({...}).first es un poco más lento que .first(where: {...}).
    También esto podría ser escrito de forma más precisa a la dirección sólo UIViewControllers.

    extension UINavigationController {
        func popToController<T: UIViewController>(_ type: T.Type, animated: Bool) {
            if let vc = viewControllers.first(where: { $0 is T }) {
                popToViewController(vc, animated: animated)
            }
        }
        func popToControllerOrToRootControllerIfNotInTheStack<T: UIViewController>(_ type: T.Type, animated: Bool) {
            if let vc = viewControllers.first(where: { $0 is T }) {
                popToViewController(vc, animated: animated)
            } else {
                popToRootViewController(animated: animated)
            }
        }
    }
  12. 1

    Actualizado para Swift 3:

    utilizados a continuación el código sencillo, pop específicos de controlador de vista;

     for vc in self.navigationController!.viewControllers as Array {
              if vc.isKind(of: YourViewControllerName) {
                   self.navigationController!.popToViewController(vc, animated: true)
                   break
              }
        }
  13. 1

    Swift 4 versión

    if let viewController = navigationController?.viewControllers.first(where: {$0 is YourViewController}) {
          navigationController?.popToViewController(viewController, animated: false)
    }

    Puede especificar otro filtro en .viewControllers.first como por su necesidad e.g digamos que si tienes el mismo kind de vista de los controladores que residen en el controlador de navegación, a continuación, puede especificar una comprobación adicional, como el de abajo

      if let viewController = navigationController?.viewControllers.first(where: {
            if let current = $0 as? YourViewController {
                 return current.someProperty == "SOME VALUE"
            }
           return false } ) {
                navigationController?.popToViewController(viewController, animated: false)
       }
  14. 0
    for controller in self.navigationController!.viewControllers as Array {
            if controller.isKind(of: LoginVC.self) {
                _ =  self.navigationController!.popToViewController(controller, animated: true)
                break
            }
        }
  15. 0

    Poner la función en UIViewController
    1. comprueba si el UIViewController existe En UINavigationController luego popToViewController o más pushViewController

    func navigate(_ navVC: AnyClass, pushVC: UIViewController) {
        for obj in self.navigationController!.viewControllers {
            if obj.isMember(of: navVC) {
                self.navigationController!.popToViewController(obj, animated: true)
                return
            }
        }
        self.navigationController!.pushViewController(pushVC, animated: true)
    }

    Uso

    self.navigate(ViewController.self, pushVC: self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController)

Dejar respuesta

Please enter your comment!
Please enter your name here