Как я могу поместить определенный контроллер просмотра в 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?
Ответы
Ответ 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)
}