web-dev-qa-db-de.com

Viewcontroller vom Navigationsstapel entfernen

Ich habe einen Navigationsstapel mit beispielsweise 5 UIViewControllern. Ich möchte den 3. und 4. Viewcontroller auf Knopfdruck im 5. Viewcontroller aus dem Stack entfernen. Ist das möglich? Wenn das so ist, wie?

77
Jean Paul Scott

Verwenden Sie diesen Code und genießen Sie:

NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];

// [navigationArray removeAllObjects];    // This is just for remove all view controller from navigation stack.
[navigationArray removeObjectAtIndex: 2];  // You can pass your index here
self.navigationController.viewControllers = navigationArray;
[navigationArray release];

Hoffe das wird dir helfen.

Bearbeiten: Swift Code

var navigationArray = self.navigationController?.viewControllers //To get all UIViewController stack as Array
navigationArray!.remove(at: (navigationArray?.count)! - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray!
144
Nit

Sie können zunächst alle View-Controller im Array abrufen und nach Überprüfung mit der entsprechenden View-Controller-Klasse die gewünschte löschen.

Hier ist ein kleines Stück Code:

NSArray* tempVCA = [self.navigationController viewControllers];

for(UIViewController *tempVC in tempVCA)
{
    if([tempVC isKindOfClass:[urViewControllerClass class]])
    {
        [tempVC removeFromParentViewController];
    }
}

Ich denke, das wird Ihnen die Arbeit erleichtern.

46

Swift 3 & 4/5

self.navigationController!.viewControllers.removeAll()

self.navigationController?.viewControllers.remove(at: "insert here a number")

Swift 2.1

alles entfernen:

self.navigationController!.viewControllers.removeAll()

am Index entfernen

self.navigationController?.viewControllers.removeAtIndex("insert here a number")

Es gibt eine Reihe weiterer möglicher Aktionen wie removeFirst, range usw.

33
kuzdu

Swift 2.0:

  var navArray:Array = (self.navigationController?.viewControllers)!
  navArray.removeAtIndex(navArray.count-2)
  self.navigationController?.viewControllers = navArray
8
tahir raees

Swift 5:

        navigationController?.viewControllers.removeAll(where: { (vc) -> Bool in
            if vc.isKind(of: MyViewController.self) || vc.isKind(of: MyViewController2.self) {
                return false
            }
            else {
                return true
            }
        })
6
Niklas

Die Verwendung der Funktion setViewControllers aus UINavigationController ist der beste Weg. Es gibt auch den Parameter animated, um die Animation zu aktivieren.

func setViewControllers(_ viewControllers: [UIViewController], animated: Bool)

Beispiel in Swift für Frage

func goToFifthVC() {

    var currentVCStack = self.navigationController?.viewControllers
    currentVCStack?.removeSubrange(2...3)

    let fifthVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "fifthVC")
    currentVCStack?.append(fifthVC)

    self.navigationController?.setViewControllers(currentVCStack!, animated: true)
}

Ich habe andere Wege ausprobiert wie [tempVC removeFromParentViewController];. Es macht seltsames Verhalten, entfernte ViewController-Navigation zeigt immer noch beim Zurückspringen, wie von @ robin-ellerkmann gemeldet

5
Megamind

Wenn Sie versuchen, von 5th View Controller zu 2nd View Controller zu wechseln (Überspringen von 3rd und 4th), möchten Sie [self.navigationController popToviewController:secondViewController].

Sie können das secondViewController vom Navigationscontroller-Stapel abrufen.

secondViewController =  [self.navigationController.viewControllers objectAtIndex:yourViewControllerIndex];
4
Vignesh

Benutze das

if let navVCsCount = navigationController?.viewControllers.count {
    navigationController?.viewControllers.removeSubrange(Range(2..<navVCsCount - 1))
}

Es kümmert sich um die ViewController von navigationController. viewControllers und auch ein in navigationBar gestapeltes Navigationselement.

Hinweis: Bitte mindestens nach viewDidAppear aufrufen

4
Nikola Markovic

Diese Lösung funktionierte für mich in Swift 4:

let VCCount = self.navigationController!.viewControllers.count
self.navigationController?.viewControllers.removeSubrange(Range(VCCount-3..<VCCount - 1))

ihr aktueller View Controller Index im Stack ist:

self.navigationController!.viewControllers.count - 1
2
babak

Ich habe eine Erweiterung mit Methode geschrieben, die alle Controller zwischen root und top entfernt, sofern nicht anders angegeben.

extension UINavigationController {
func removeControllers(between start: UIViewController?, end: UIViewController?) {
    guard viewControllers.count > 1 else { return }
    let startIndex: Int
    if let start = start {
        guard let index = viewControllers.index(of: start) else {
            return
        }
        startIndex = index
    } else {
        startIndex = 0
    }

    let endIndex: Int
    if let end = end {
        guard let index = viewControllers.index(of: end) else {
            return
        }
        endIndex = index
    } else {
        endIndex = viewControllers.count - 1
    }
    let range = startIndex + 1 ..< endIndex
    viewControllers.removeSubrange(range)
}

}

Wenn Sie den Bereich verwenden möchten (zum Beispiel: 2 bis 5), können Sie einfach verwenden

    let range = 2 ..< 5
    viewControllers.removeSubrange(range)

Getestet unter iOS 12.2, Swift 5

0
Adam

Swift 5, Xcode 10.

extension UINavigationController{
public func removePreviousController(total: Int){
    let totalViewControllers = self.viewControllers.count
    self.viewControllers.removeSubrange(totalViewControllers-total..<totalViewControllers - 1)
}}

Stellen Sie sicher, dass Sie diese Dienstprogrammfunktion nach viewDidDisappear () des vorherigen Controllers oder viewDidAppear () des neuen Controllers aufrufen

0
Kedar Sukerkar