Pregunta

Estoy utilizando la aplicación basada en la navegación. Empujo Primera ViewController a Segunda ViewController y desde la segunda a la tercera ViewController ViewController. Ahora quiero hacer estallar de Tercera a Primera ViewController ViewController.I estoy realizando esta tarea mediante el siguiente código, pero mi solicitud se estrelló.

Por favor, dame cualquier órgano algunas pautas adecuadas. No puedo usar el pop a RootViewController porque es diferente viewController. Gracias de antemano ...

En tercer lugar ViewControler he escrito esto:

FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil];
[self.navigationController popToViewController:x animated:NO];
¿Fue útil?

Solución

Al escribir la primera línea a obtener los índices de todos los controladores de Vista y de segunda línea Va a llegar hasta su destino.

NSArray *array = [self.navigationController viewControllers];

[self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];

Otros consejos

Un enfoque 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;
        }
    }
}

Swifty manera:

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

A menudo es más importante hacerlo 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 se llama ese

popToLast:[SomeViewController class];
- (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;
            }
    }
}

rápida y segura Swift 3 Versión:

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

Su código crea una nueva instancia de una visión que nunca se ha llevado a la pila, luego trata de hacer estallar de nuevo a ese controlador.

Si están apareciendo de nuevo al controlador de vista raíz, puede usos popToRootViewControllerAnimated:

Si está viniendo rápidamente una distancia conocida puede llamar popViewControllerAnimated: más de una vez. En su ejemplo, que sería 2 controladores por así llamadas. Se podría hacer lo mismo mirando en viewControllers para el controlador 2 del final y hacer estallar a la misma.

Las sugerencias anteriores son soluciones rápidas. Una práctica mejor escenario sería pasar el controlador que desea devolver a lo largo de cada controlador sucesiva se presiona. En primer lugar se hace pasar a segundo, segundo pasa que la referencia a terceros terceros pops, a la referencia pasado, que es primero.

En efecto, se está creando un controlador de raíz temporal. Usted podría subclase UINavigationController y añadir una propiedad temporaryRoot y un método popToTemporaryRootViewControllerAnimated: que el pop a la raíz temporal y desactivarla. Cuando primeros empujones segundos, sino que también pondrían a sí misma como la raíz temporal para que todos los controladores de la pila no tiene que pasar una referencia alrededor. Usted tendría que añadir algunas comprobaciones adicionales para no está seguro que nunca más allá del pop temporaryRoot sin borrarlo.

Después de mucho esfuerzo que alguien ha creado la extensión rápida de volver a un controlador de vista particular 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
            }
        }
    }
}

método de llamada:

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

aplicado y probado en Swift 3.0

A continuación se muestra un método que puede útil para navegar a cualquier específica Vista Controlador:

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)

creo que .filter({...}).first es un poco más lento que .first(where: {...}). También esto podría escribirse con mayor precisión 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)
        }
    }
}
  

Actualización de Swift 3:

utiliza a continuación código simple, para el estallido de controlador de vista específico;

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

Swift 4 versión

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

Se puede especificar otro filtro en .viewControllers.first según su necesidad por ejemplo digamos que si tiene misma kind de los controladores de vista que residen en el controlador de navegación a continuación, se puede especificar una comprobación adicional, como a continuación

  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)
   }
for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: LoginVC.self) {
            _ =  self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

Función Poner en UIViewController 1. comprueba si existe UIViewController específico en UINavigationController entonces popToViewController o pushViewController otro

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)

He aquí la respuesta. Este es el código de trabajo del 100% para Swift> 4.X

¿Cómo puedo hacer estallar Vista Controlador específica en Swift

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top