it-swarm.com.de

Pop 2 Ansicht Controller in Nav Controller in Swift

Ich habe viele Möglichkeiten gefunden, um 2 UIViewControllers in UINavigationController mit Objective-C wieder zu öffnen, aber wenn ich versuche, auf Swift umzustellen, scheint es nicht zu funktionieren. 

Was wäre der beste Ansatz, um auf UIViewController zurückzugreifen? Jegliche Anleitung wäre dankbar Vielen Dank

29
candidaMan

Wenn Sie meinen Kommentar erweitern, suchen Sie den vorletzten View-Controller im viewControllers-Array und verwenden Sie dann popToViewController, um das Überschreiben des gesamten View-Controller-Stacks zu vermeiden.

Beispiel (nimmt an, dass der Navigationscontroller mehr als einen Viewcontroller hat):

func backTwo() {
    let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]
    self.navigationController!.popToViewController(viewControllers[viewControllers.count - 3], animated: true)
}
96
Aaron Wojnowski

Ich habe eine UIViewController-Erweiterung geschrieben (Swift 3+ ready)

Sie könnten so verwenden:

/// pop back n viewcontroller
func popBack(_ nb: Int) {
    if let viewControllers: [UIViewController] = self.navigationController?.viewControllers {
        guard viewControllers.count < nb else {
            self.navigationController?.popToViewController(viewControllers[viewControllers.count - nb], animated: true)
            return
        }
    }
}

Verwendungszweck :

self.popBack(3)

Bonus auf einen bestimmten Viewcontroller entlassen

/// pop back to specific viewcontroller
func popBack<T: UIViewController>(toControllerType: T.Type) {
    if var viewControllers: [UIViewController] = self.navigationController?.viewControllers {
        viewControllers = viewControllers.reversed()
        for currentViewController in viewControllers {
            if currentViewController .isKind(of: toControllerType) {
                self.navigationController?.popToViewController(currentViewController, animated: true)
                break
            }
        }
    }
}

Verwendungszweck :

self.popBack(toControllerType: MyViewController.self)
14
Maximelc

user5320485 antworten in swift3  

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

Sie können mehrere Viewcontroller dynamisch in (Swift 2.0) platzieren.

let allViewController: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];

                        for aviewcontroller : UIViewController in allViewController
                        {
                            if aviewcontroller .isKindOfClass(YourDestinationViewControllerName)
                            {
                             self.navigationController?.popToViewController(aviewcontroller, animated: true)
                            }
                        }
11
Reema

Swift 4 UINavigationController-Erweiterungsversion von @ Maximelc's Antwort:

extension UINavigationController {

    func popBack(_ nb: Int) {
        let viewControllers: [UIViewController] = self.viewControllers
        guard viewControllers.count < nb else {
            self.popToViewController(viewControllers[viewControllers.count - nb], animated: true)
            return
        }
    }

    /// pop back to specific viewcontroller
    func popBack<T: UIViewController>(toControllerType: T.Type) {
        var viewControllers: [UIViewController] = self.viewControllers
        viewControllers = viewControllers.reversed()
        for currentViewController in viewControllers {
            if currentViewController .isKind(of: toControllerType) {
                self.popToViewController(currentViewController, animated: true)
                break
            }
        }
    }

 }
1
CodenameDuchess

Hier ist eine weitere, leicht "idiotensichere" Version:

extension UINavigationController {
    func popBack(_ count: Int) {
        guard count > 0 else {
            return assertionFailure("Count can not be a negative value.")
        }
        let index = viewControllers.count - count - 1
        guard index > 0 else {
            return assertionFailure("Not enough View Controllers on the navigation stack.")
        }
        popToViewController(viewControllers[index], animated: true)
    }
}
0
Balázs Vincze

Ich habe einen Helfer gemacht, um es einfach zu machen:

import Foundation
import UIKit

class NavigationHelper {

    static func back(number: Int, from viewControlller : UIViewController) {
        let viewsBack = number + 1
        let viewControllers: [UIViewController] = viewControlller.navigationController!.viewControllers as [UIViewController]
        viewControlller.navigationController!.popToViewController(viewControllers[viewControllers.count - viewsBack], animated: true)
    }

    static func back(number: Int, from viewControlller: UITableViewController) {
        let viewsBack = number + 1
        let viewControllers: [UIViewController] = viewControlller.navigationController!.viewControllers as [UIViewController]
        viewControlller.navigationController!.popToViewController(viewControllers[viewControllers.count - viewsBack], animated: true)
    }
}

In Ihrer ViewController können Sie beispielsweise NavigationHelper.back(number: 1, from: self) verwenden.

0
LagMaster