Dismiss View Controller在Helper类Swift中不起作用

时间:2019-02-26 11:21:50

标签: ios swift

所以我有一个如下编写的帮助程序类:

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

5 个答案:

答案 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)

这将关闭视图控制器并替换为新控制器。