Mah*_*iya 28 uiviewcontroller ios 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在Swift中做到这一点?
Moh*_*hit 80
请尝试以下代码:
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: ViewController.self) {
self.navigationController!.popToViewController(controller, animated: true)
break
}
}
Run Code Online (Sandbox Code Playgroud)
Mus*_*ari 30
对于Swift 3
let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
if aViewController is YourViewController {
self.navigationController!.popToViewController(aViewController, animated: true)
}
}
Run Code Online (Sandbox Code Playgroud)
Ash*_*shu 23
Swift 4.0
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: DashboardVC.self) {
_ = self.navigationController!.popToViewController(controller, animated: true)
break
}
}
Run Code Online (Sandbox Code Playgroud)
这是完美的.
Pab*_*loR 14
我更喜欢通用的方法来做到这一点.
我有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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
假设我在导航堆栈中实例化了一个FOHomeVC类(谁是UIViewController).
所以我会在我的代码中执行此操作:
self.navigationController?.backToViewController(FOHomeVC.self)
Run Code Online (Sandbox Code Playgroud)
我添加了一个扩展来UINavigationController帮助您查找导航堆栈中是否存在该控制器。如果是,那么它将弹出到该控制器,否则您将传递新控制器以使用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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特 4 / 斯威夫特 5
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: HomeViewController.self) {
self.navigationController!.popToViewController(controller, animated: true)
break
}
}
Run Code Online (Sandbox Code Playgroud)
迅捷5
弹出特定类的最新实例,例如SomeViewController:
navigationController?.popToViewController(ofClass: SomeViewController.self)
Run Code Online (Sandbox Code Playgroud)
但是您需要添加以下UINavigationController扩展名:
extension UINavigationController {
func popToViewController(ofClass: AnyClass, animated: Bool = true) {
if let vc = viewControllers.last(where: { $0.isKind(of: ofClass) }) {
popToViewController(vc, animated: animated)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢“真正通用”且更实用的方法。
所以我想出了以下UINavigationController扩展功能。您还可以将第一个函数用于其他任何用途,只需访问导航堆栈中的特定 VC 即可。
扩展
extension UINavigationController {
func getViewController<T: UIViewController>(of type: T.Type) -> UIViewController? {
return self.viewControllers.first(where: { $0 is T })
}
func popToViewController<T: UIViewController>(of type: T.Type, animated: Bool) {
guard let viewController = self.getViewController(of: type) else { return }
self.popToViewController(viewController, animated: animated)
}
}
Run Code Online (Sandbox Code Playgroud)
用法
self.navigationController?.popToViewController(of: YourViewController.self, animated: true)
Run Code Online (Sandbox Code Playgroud)
这至少应该在 Swift 4 和 5 中有效。
| 归档时间: |
|
| 查看次数: |
45134 次 |
| 最近记录: |