Подтвердить что ты не робот

Как я могу поместить определенный контроллер просмотра в Swift

Я использовал приведенный ниже код Objective-C для добавления определенного ViewController.

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

Как я могу сделать это в Swift?

4b9b3361

Ответ 1

Попробуйте следующий код:

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

Ответ 2

Для Swift 3

let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
    if aViewController is YourViewController {
        self.navigationController!.popToViewController(aViewController, animated: true)
    }
}

Ответ 3

Swift 4.0

for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: DashboardVC.self) {
            _ =  self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

Это работает Perfect.

Ответ 4

Я предпочитаю общий способ сделать это.

У меня есть это расширение для UINavigationController:

extension UINavigationController {

   func backToViewController(vc: Any) {
      // iterate to find the type of vc
      for element in viewControllers as Array {
         if "\(element.dynamicType).Type" == "\(vc.dynamicType)" {
            self.popToViewController(element, animated: true)
            break
         }
      }
   }

}

Скажем, у меня есть класс FOHomeVC (который является UIViewController), созданный в стеке навигации.

Поэтому я бы сделал это в своем коде:

self.navigationController?.backToViewController(FOHomeVC.self)

Ответ 5

Swift 5

Чтобы перейти к последнему экземпляру определенного класса, например SomeViewController:

navigationController?.popToViewController(ofClass: SomeViewController.self)

Но вам нужно добавить это расширение UINavigationController:

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

Ответ 6

Я добавил расширение для UINavigationController которое поможет вам найти, существует ли этот контроллер в стеке навигации. Если да, то он будет подключен к этому контроллеру, иначе вы передадите новый контроллер для push с параметром pushController.

extension UINavigationController {

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

    func popPushToVC(ofKind kind: AnyClass, pushController: UIViewController) {
        if containsViewController(ofKind: kind) {
            for controller in self.viewControllers {
                if controller.isKind(of: kind) {
                    popToViewController(controller, animated: true)
                    break
                }
            }
        } else {
            pushViewController(pushController, animated: true)
        }
    }
}

Ответ 7

Найдите свой контроллер вида из стека навигации и откройте его, если он существует

for vc in self.navigationController!.viewControllers {
    if let myViewCont = vc as? VCName 
    {
        self.navigationController?.popToViewController(myViewCont, animated: true)
    }
}

Ответ 8

В последнем стремительном

   @IBAction func popToConversationsVC(_ sender: UIButton) {
        if (self.navigationController != nil) {
            for vc in  self.navigationController!.viewControllers {
                if vc is ConversationsVC {
                     self.navigationController?.popToViewController(vc, animated: false)
                }
            }
            }
    }

Ответ 9

Пожалуйста, используйте этот ниже код для Swift 3.0:

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

for aViewController:UIViewController in viewControllers {
            if aViewController.isKind(of: YourViewController.self) {
                _ = self.navigationController?.popToViewController(aViewController, animated: true)
            }
        }

Ответ 10

Swift 4

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

Ответ 11

Мне нужно было использовать это, потому что в некоторых случаях происходит сбой приложения:

if let navVC = self.navigationController {
                    let views = navVC.viewControllers as Array
                    for controller in views {
                        if controller.isKind(of: YourVC.self) {
                            navVC.popToViewController(controller, animated: true)
                            return
                        }
                    }
                }

Ответ 12

Мне нравится использовать функцию ниже, чтобы получить ссылку на любой UIViewController в стеке навигации. Если такой ссылки нет, она просто возвращает nil.

extension UINavigationController {

    func getReferenceTo<ViewController: UIViewController>(viewController: ViewController.Type) -> ViewController? {
        return self.viewControllers.first { $0 is ViewController } as? ViewController
    }
}

Случай использования:

func tappedBackToHomeButton() {
    guard let homeVC = self.navigationController?.getReferenceTo(viewController: HomeVC.self) else { return }
    // Pass variables if needed.
    self.navigationController?.popToViewController(homeVC, animated: true)
}

Ответ 13

extension UINavigationController {
    func popBack(to vc: AnyClass, animated: Bool = true) {
        guard let elementFound = (viewControllers.filter { $0.isKind(of: vc) }).first else {
            fatalError("cannot pop back to \(vc) as it is not in the view hierarchy")
        }
        self.popToViewController(elementFound, animated: animated)
    }
}

Ответ 14

простое и лучшее решение без распаковки - это

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