Domanda

Sto usando un'applicazione basata navigazione. Spingo Prima ViewController a Second ViewController e da Second ViewController al Terzo ViewController. Ora voglio pop da Terzo ViewController a First ViewController.I am eseguire questa operazione utilizzando il codice qui sotto, ma la mia domanda è schiantato.

Si prega di qualsiasi organismo darmi qualche linee guida corretta. Non posso usare pop alla RootViewController perché è diverso viewController. Grazie in anticipo ...

In terzo luogo ViewControler Ho scritto questo:

FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil];
[self.navigationController popToViewController:x animated:NO];
È stato utile?

Soluzione

Con la scrittura della prima linea che si ottiene gli indici di tutti i controller di vista e dalla seconda linea Si raggiunge fino alla vostra destinazione.

NSArray *array = [self.navigationController viewControllers];

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

Altri suggerimenti

Un approccio più sicuro:

- (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;
        }
    }
}

modo Swifty:

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

Spesso è più importante per farlo dalla cima della pila, quindi:

- (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;
        }
    }
}

e si chiama che

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

rapida e sicura Swift 3 Versione:

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

Il codice crea una nuova istanza di una vista che non è mai stato inserito nello stack, quindi tenta di pop torna a tale controller.

Se si stanno spuntando indietro al controller della vista principale, è possibile usi popToRootViewControllerAnimated:

Se si stanno spuntando indietro una distanza nota è possibile chiamare popViewControllerAnimated: più di una volta. Nel tuo esempio, che sarebbe 2 controller per così chiamate. Si potrebbe fare la stessa cosa, cercando in viewControllers per il controller 2 dalla fine e popping ad esso.

I suggerimenti di cui sopra sono soluzioni rapide. Uno scenario migliore prassi sarebbe quella di passare il controller che si desidera tornare insieme a ciascun controller successivo si preme. Prima si passa alla seconda, passa seconda che il riferimento a terzi, terzi pop al riferimento passato, che è prima.

In effetti, si sta creando un controller di root temporanea. Si potrebbe sottoclasse UINavigationController e aggiungere una proprietà temporaryRoot e un metodo popToTemporaryRootViewControllerAnimated: che sarebbe pop alla vostra root temporanea e cancellarlo. Quando primi spinge secondi, sarebbe anche prefissata come root temporanea in modo che ogni controllore nella pila non deve passare un riferimento intorno. Si dovrebbe aggiungere alcuni controlli extra per Incerto mai pop oltre la temporaryRoot senza cancellare esso.

Dopo un sacco di fatica qualcuno ha creato rapida estensione di tornare a un particolare controller della vista a 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
            }
        }
    }
}

metodo chiamante:

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

Implementato & Tested in Swift 3.0

Di seguito è riportato metodo che può utile per navigare all'interno di qualsiasi specifica View Controller:

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

Utilizzo:

self.poptoSpecificVC(viewController: createIntervalVC.self)

Credo che .filter({...}).first è un po 'più lento rispetto .first(where: {...}). Anche questo potrebbe essere scritto più precisamente di affrontare solo 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)
        }
    }
}
  

Aggiornamento per Swift 3:

usato sotto semplice codice, per pop specifico controller di vista;

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

Swift 4 versione

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

E 'possibile specificare un altro filtro su .viewControllers.first secondo il vostro bisogno per esempio Diciamo che se avete stesso kind di vista controllori residenti nel controller di navigazione, allora è possibile specificare un ulteriore controllo come qui di seguito

  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
        }
    }

Mettere in funzione UIViewController 1. controlla se UIViewController specifico esiste in UINavigationController quindi popToViewController oppure 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)
}

Usa

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

ho risposta qui. Questo è il codice a lavorare al 100% per Swift> 4.X

Come posso pop specifica View Controller in Swift

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top