所以我有一个如下编写的帮助程序类:
class Helper {
static func handleTokenInvalid() {
DispatchQueue.main.async {
UIViewController().dismiss()
}
}
}
extension UIViewController {
func dismiss() {
let root = UIApplication.shared.keyWindow?.rootViewController
root?.dismiss(animated: true, completion: nil) }
}
我想关闭所有打开并返回到应用程序根目录的视图控制器。但是,它不起作用。如果我在普通的视图控制器中做同样的工作。有人知道解决方案吗?谢谢!
编辑: 我已经尝试过了,但是它说在包装可选值时发现nil。
func dismiss() {
self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)
}
答案 0 :(得分:1)
您正在做的所有事情
UIViewController().dismiss
正在创建一个新的视图控制器并将其关闭。 您必须在实际显示的View控制器实例上调用dismiss。
答案 1 :(得分:0)
extension UIApplication {
class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
if let navigationController = controller as? UINavigationController {
return topViewController(controller: navigationController.visibleViewController)
}
if let tabController = controller as? UITabBarController {
if let selected = tabController.selectedViewController {
return topViewController(controller: selected)
}
}
if let presented = controller?.presentedViewController {
return topViewController(controller: presented)
}
return controller
}
}
您可以在Helper类的任何地方使用它
if let topController = UIApplication.topViewController() {
topController.dismiss(animated: true, completion: nil)
}
答案 2 :(得分:0)
您可以更改rootViewController,
UIApplication.shared.keyWindow?.rootViewController = yourController
答案 3 :(得分:0)
我认为有一个更好的解决方案,而不必关闭当前应用程序窗口的根视图控制器。
将完成处理程序添加到您的方法中,当您从控制器内部调用它时,在闭包中声明完成将被调用后,您需要关闭self
(如果要通过{{ 1}},只需将其弹出即可)
UINavigationController
然后在控制器中使用完成处理程序调用您的方法
static func handleTokenInvalid(completion: @escaping () -> Void) {
DispatchQueue.main.async {
completion()
}
}
答案 4 :(得分:0)
两天后,找到了解雇我的控制器的正确方法,却找不到任何方法,因为我认为Xcode发现我当前的控制器为nil。相反,我使用这个:
let viewController = UIStoryboard(name: "DashboardPreLogin", bundle: Bundle.main).instantiateViewController(withIdentifier: "TabBarPreLoginViewController")
let appDel: AppDelegate = UIApplication.shared.delegate as! AppDelegate
appDel.window?.rootViewController = nil
appDel.window?.rootViewController = viewController
UIView.transition(with: appDel.window!, duration: 0.5, options: UIViewAnimationOptions.transitionCrossDissolve, animations: {() -> Void in appDel.window?.rootViewController = viewController}, completion: nil)
这将关闭视图控制器并替换为新控制器。