首页 > 解决方案 > 从控制器外部呈现视图控制器,不传递自引用

问题描述

我有一个应用程序,其中有管理员和普通用户,管理员可以删除用户。删除用户后,我需要显示您已被删除。我从服务器获取 apn,据此我必须向他展示视图控制器,解释为什么会发生这种情况并清除他的所有数据。目前,一旦我收到 apn,我就会发布一个通知,该通知由显示该视图控制器的视图控制器接收。

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewController = storyboard.instantiateViewController(withIdentifier: "AccountLockedController") as! AccountLockedController
self.present(viewController, animated: true) {
            print("Presented")
        }

现在项目的规模越来越大,所以现在我将 self 的引用传递给一个函数来基本上做同样的事情

userInactivated(viewController: self) 

从所有视图控制器中,函数中都存在帐户锁定视图控制器

有没有办法让我直接显示当前视图控制器引用的帐户锁定视图控制器,或者我可以得到这个值我找到了这个但是

if let presentingViewController = self.appDelegate.window?.rootViewController?.presentingViewController {}

但是在非视图控制器类中没有 self.appDelegate

感谢任何帮助谢谢

标签: iosviewcontroller

解决方案


您可以使用此扩展程序

extension UIApplication
{
    class func topViewController(_ base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController?
    {
        if let nav = base as? UINavigationController
        {
            let top = topViewController(nav.visibleViewController)
            return top
        }

        if let tab = base as? UITabBarController
        {
            if let selected = tab.selectedViewController
            {
                let top = topViewController(selected)
                return top
            }
        }

        if let presented = base?.presentedViewController
        {
            let top = topViewController(presented)
            return top
        }
        return base
    }

}

然后您可以使用此代码从任何地方展示您的控制器

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewController = storyboard.instantiateViewController(withIdentifier: "AccountLockedController") as! AccountLockedController
UIApplication. topViewController()?.present(viewController, animated: true) {
            print("Presented")
        }

推荐阅读