it-swarm.com.de

Wie kann ich zwei Ansichten gleichzeitig von einem Navigationscontroller aus öffnen?

Ich möchte zur dritten Ansicht des Navigationsstapels zurück zur ersten Ansicht.

Ich weiß, wie man eine Ansicht auf einmal öffnet:

[self.navigationController popViewControllerAnimated:YES];

Aber wie mache ich zwei gleichzeitig?

Vielen Dank...

80
Adam Waite

Sie können dies auch versuchen, zwischen dem Navigationscontroller-Stack zu springen

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
    if ([aViewController isKindOfClass:[RequiredViewController class]]) {
        [self.navigationController popToViewController:aViewController animated:NO];
    }
}
123
Meet

Hier sind zwei UINavigationController-Erweiterungen, die Ihr Problem lösen können. Ich würde empfehlen, die erste zu verwenden, die auf einen UIViewController einer bestimmten Klasse verweist:

extension UINavigationController {

  func popToViewController(ofClass: AnyClass, animated: Bool = true) {
    if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
      popToViewController(vc, animated: animated)
    }
  }

  func popViewControllers(viewsToPop: Int, animated: Bool = true) {
    if viewControllers.count > viewsToPop {
      let vc = viewControllers[viewControllers.count - viewsToPop - 1]
      popToViewController(vc, animated: animated)
    }
  }

}

und benutze es so:

// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)

// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)
51
budidino

Sie können mit popToRootViewControllerAnimated zum "root" (ersten) View-Controller wechseln:

[self.navigationController popToRootViewControllerAnimated:YES];

// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];

UINavigationController Referenz :

Hebt alle View-Controller auf dem Stack mit Ausnahme des Root-View-Controllers auf und aktualisiert die Anzeige.

Rückgabewert
Ein Array von View-Controllern, die vom Stapel entfernt werden.

43
chown
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];   

objectAtIndex: 1 -> Sie können den Index übergeben, zu dem Sie wechseln möchten

29
Zaraki

Swift 2 - xCode 7.3

Dies könnte eine sehr nützliche Erweiterung für UIViewControllers sein:

extension UINavigationController {

    func popToViewControllerOfType(classForCoder: AnyClass) {
        for controller in viewControllers {
            if controller.classForCoder == classForCoder {
                popToViewController(controller, animated: true)
                break
            }
        }
    }

    func popViewControllers(controllersToPop: Int, animated: Bool) {
        if viewControllers.count > controllersToPop {
            popToViewController(viewControllers[viewControllers.count - (controllersToPop + 1)], animated: animated)
        } else {
            print("Trying to pop \(controllersToPop) view controllers but navigation controller contains only \(viewControllers.count) controllers in stack")
        }
    }
}
18
lubilis

Wenn Sie einfach nur 2 auf einmal platzieren möchten, weil Ihr rootViewController (Weg) "tiefer" ist, dann können Sie 2 eine Kategorie zu UIviewController hinzufügen: 

UINavigationController + popTwice.h

#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated;

@end

UINavigationController + popTwice.m

#import "UINavigationController+popTwice.h"

@implementation UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated{
    [self popViewControllerAnimated:NO];
    [self popViewControllerAnimated:animated];
}

@end

Importieren Sie die Kategorie #import "UINavigationController+popTwice.h" an einer beliebigen Stelle in Ihrer Implementierung, und verwenden Sie diese Codezeile, um zwei Controller gleichzeitig zu öffnen:

[self.navigationController popTwoViewControllersAnimated:YES];

ist das nicht toll? :)

15
Tieme
//viewIndex = 1;
//viewIndex = 2;
//viewIndex = 3;

// **[viewControllers objectAtIndex: *put here your viewindex number*]

NSArray *viewControllers = [self.navigationController viewControllers];
[self.navigationController popToViewController:[viewControllers objectAtIndex:viewIndex] animated:NO];
5
Sabareesh

Sie können dieses auch versuchen: - 

[self.navigationController popToViewController:yourViewController animated:YES];
5
Leena
    NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
    [newStack removeLastObject];
    [newStack removeLastObject];
    [self.navigationController setViewControllers:newStack animated:YES];
4
patrickandroid

In Swift 3 , Können Sie einen, zwei oder mehr Viewcontroller von einem Navigationscontroller auf diese Weise platzieren

let viewControllers = self.navigationController!.viewControllers as [UIViewController]
    for aViewController:UIViewController in viewControllers {
        if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
            _ = self.navigationController?.popToViewController(aViewController, animated: true)
        }
    }

Hier ist FromWhereYouWantToGoController der Zielcontroller. Ich hoffe es hilft. 

4
Riajur Rahman

Sie können den anfänglichen View-Controller (den Controller, auf den Sie zurückkehren möchten) übergeben und dann in der letzten Ansicht diese Zeile aufrufen:

[self.navigationController popToViewController:yourInitialViewController animated:YES];

L.

3
Lucas

Ich habe diese Antwort hier nicht gesehen. Wenn Sie nur einige (nicht den ganzen Weg zum Stammverzeichnis) platzieren möchten, können Sie einfach durch self.navigationController.viewControllers nach Klassentypen durchlaufen, oder wenn Sie eine Referenz haben, verwenden Sie das

for (UIViewController *aViewController in self.navigationController.viewControllers) {
   if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
      [self.navigationController popToViewController:aViewController animated:YES];
   }
}
3
VaporwareWolf

Hier ist eine kleine Funktion, die ich verwende, um X ViewControllers zurückzukehren: 

-(void)backMultiple:(id)data {
    int back = 2; //Default to go back 2 
    int count = [self.navigationController.viewControllers count];

    if(data[@"count"]) back = [data[@"count"] intValue];

    //If we want to go back more than those that actually exist, just go to the root
    if(back+1 > count) {
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
    //Otherwise go back X ViewControllers 
    else {
        [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:count-(back+1)] animated:YES];
    }
}
2
Mark

sie können zum Root-View-Controller zurückkehren

[self.navigationController popToRootViewControllerAnimated:YES];

wenn die Ansicht, zu der Sie wechseln möchten, nicht die erste ist, müssen Sie sie erneut in der Ansicht viewAppear Ihrer vorherigen Ansicht aufrufen

2
Robotnik

Sie können den Stack der UIViewControllers verwenden. 1. Holen Sie das Array aller viewControllers im Stack . 2. Durchlaufen Sie das gesamte Array und suchen Sie den gewünschten viewController
durch Übereinstimmung mit dem Klassentyp . 3. Pop den viewController.

func popToSpecificViewC
{
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
        for viewController:UIViewController in viewControllers
        {
            if viewController.isKind(of: WelcomeViewC.self)
            {
                _ = self.navigationController?.popToViewController(viewController, animated: true)
            }
        }
}
1
Peeyush karnwal

Swift-Version ab (Swift 1.2/Xcode 6.3.1) Zweimal oder mehr

 var viewControllers = self.navigationController?.viewControllers
 viewControllers?.removeLast()
 viewControllers?.removeLast()
 self.navigationController?.setViewControllers(viewControllers, animated: true)

oder 

 var viewControllers = self.navigationController?.viewControllers
 var viewsToPop = 2
 var end = (viewControllers?.count)!
 var start = end - viewsToPop
 viewControllers?.removeRange(Range<Int>(start: start, end: end))
 self.navigationController?.setViewControllers(viewControllers, animated: true)
1
Glenn S

Swift 4:

func popViewControllerss(popViews: Int, animated: Bool = true) {
    if self.navigationController!.viewControllers.count > popViews
    {
        let vc = self.navigationController!.viewControllers[self.navigationController!.viewControllers.count - popViews - 1]
         self.navigationController?.popToViewController(vc, animated: animated)
    }
}

Dann verwenden Sie diese Methode

self.popViewControllerss(popViews: 2)
0
Saifan Nadaf