it-swarm.com.de

So prüfen Sie, ob der Viewcontroller im Stack hinzugefügt wird oder nicht

Ich habe zwei View-Controller. Ich habe von einer Ansicht zu einer anderen Ansicht navigiert, indem Sie die Taste drücken, um den folgenden Code zu verwenden.

 *let secondViewController = self.storyboard!.instantiateViewControllerWithIdentifier("NotificationController") as! NotificationController

self.navigationController!.pushViewController(secondViewController, animated: true)*

Für die Rückseite verwende ich den Balkenknopf auf dem Balkenknopf. Klicken Sie für die Rückseite mit dem folgenden Code.

 self.navigationController?.popViewControllerAnimated(true)

Mein Problem ist also, wenn ich kontinuierlich von einer Ansicht zu einer anderen gehe, dann fügte es zu einem Stapel hinzu. Ich möchte nur eine andere Ansicht anzeigen, wenn sie bereits zum Stack hinzugefügt wurde, um das Hinzufügen zu beenden. Sie wird nur einmal hinzugefügt.

7
Gaurav Gupta

Um zu überprüfen, ob der navigation stack einen bestimmten Typ von view controller enthält, können Sie Folgendes verwenden:

if let viewControllers = self.navigationController?.viewControllers
{
    if viewControllers.contains(where: {
        return $0 is YourViewController
    })
    {
        //Write your code here
    }
}

Um einen bestimmten Controller aus dem Navigationsstapel zu entfernen, müssen Sie Änderungen am Navigationsstapel vornehmen.

Beispiel:

    if var viewControllers = self.navigationController?.viewControllers
    {
        for controller in viewControllers
        {
            if controller is UIViewController
            {
                viewControllers.removeElement(controller)
                self.navigationController?.viewControllers = viewControllers
            }
        }
    }
14
PGDev

Für Swift 4 können Sie verwenden

 if let viewControllers = self.navigationController?.viewControllers {
       for vc in viewControllers {
            if vc.isKind(of: YourViewController.classForCoder()) {
                 print("It is in stack")
                 //Your Process
            }
       }
 }
9
vp2698

Ausarbeitung der Antwort von PGDev für Swift 4.1

So entfernen Sie eine bestimmte UIViewController-Unterklasse aus dem UINavigationController-Stack:

/// Given 'nc' is a valid UINavigationController instance,
/// removes all instances of MyViewController from the stack

nc.viewControllers = nc.viewControllers.filter { !($0 is MyViewController) }

Eine Erweiterung hinzufügen:

extension UINavigationController
{
    /// Given the kind of a (UIViewController subclass),
    /// removes any matching instances from self's
    /// viewControllers array.

    func removeAnyViewControllers(ofKind kind: AnyClass)
    {
        self.viewControllers = self.viewControllers.filter { !$0.isKind(of: kind)}
    }

    /// Given the kind of a (UIViewController subclass),
    /// returns true if self's viewControllers array contains at
    /// least one matching instance.

    func containsViewController(ofKind kind: AnyClass) -> Bool
    {
        return self.viewControllers.contains(where: { $0.isKind(of: kind) })
    }
}

Verwendungszweck:

guard let nc = self.navigationController else { return }

let exists = nc.containsViewController(ofKind: MyViewController.self)

nc.removeAnyViewControllers(ofKind: MyViewController.self)

BTW, wenn jemand weiß, wie man "kind" auf Unterklassen von UIViewController beschränkt, schreien Sie bitte auf.

5
Womble
extension UINavigationController {
    public func hasViewController(ofKind kind: AnyClass) -> UIViewController? {
        return self.viewControllers.first(where: {$0.isKind(of: kind)})
    }
}

VERWENDEN

self.navigationController.hasViewController(ofKind: #ViewControllerName#.self)
2
GameLoading

Hier ist der Code, um es zu überprüfen.

if let viewControllers = navigationController?.viewControllers {
    for viewController in viewControllers {
        // some process
        if viewController.isKindOfClass(ViewControllerClassName) {
            println("yes it is")
        }
    } 
}
2
Sivajee Battina

Sie können dies mit code überprüfen.

Ziel c

NSArray * controllers = [self.navigationController viewControllers];

    for (int i = 0; i < [controllers count]; i++){

        UIViewController * controllerTest = [controllers objectAtIndex:i];

        if([controllerTest isKindOfClass:[YourController class]]){
            NSLog(@"Class is available");
        }

    }

Swift 3.0

if let viewControllers = self.navigationController?.viewControllers {
            for viewController in viewControllers {
                // some process
                if viewController.isKindOfClass(YourController) {
                    print("Class is available")
                }
            } 
        }
1
Abhishek Sharma

Auf geht's.

Diese Zeile enthält ein Array von UIViewControllern

self.navigationController?.viewControllers

Nun müssen Sie überprüfen, ob Ihr viewControllerObject vorhanden ist oder nicht.

Schreiben Sie diese Zeile 

if viewController.isKindOfClass(YourController){
}

und hier ist ein vollständiger Code.

if let viewControllers = self.navigationController?.viewControllers {
            for viewController in viewControllers {

                if viewController.isKindOfClass(YourController) {
                    print("Your controller exist")
                }
       } 
}

Wenn Sie unterhalb der Zeile schreiben, während Sie zu 'ViewControllerA' zurückkehren, wird ein ViewControllerB aus dem Navigationsstapel entfernt.

self.navigationController?.popViewControllerAnimated(true)

Es ist nur ein ähnlicher Pop-Vorgang, den wir mit Stack ausführen, und der Navigationscontroller ist ein Stack. 

Lassen Sie mich wissen, wenn Sie Verwirrungen haben.

1
Anil Kukadeja

Hier ist eine andere Lösung:

    guard let controllersInStack = navigationController?.viewControllers else { return }
    if let yourViewController = controllersInStack.first(where: { $0 is YourViewController }) {
        // Do what you want with yourViewController
    }
0
Faipdeoiad

Swift 5 (Funktion getestet). Eine bessere Möglichkeit, um zu überprüfen, ob der View Controller in der Navigation gestapelt ist oder nicht, besteht darin, einfach nach der Zugänglichkeit des View Controllers zu fragen. Siehe das folgende Beispiel. Mit diesem Snippet kann zum vorherigen View Controller zurückgekehrt werden.

    if self.navigationController?.accessibilityActivate() != nil {
        self.navigationController?.popViewController(animated: true)
    } else {
        self.dismiss(animated: true, completion: nil)
    }
0
Nishad Arora