从控制器外部呈现视图控制器,不传递自引用

Present View Controller From outside of controller with out passing self reference

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

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.appDelegateclass

感谢任何帮助,谢谢

您应该先退出用户并将您的 window?.rootViewController 设置为 Accountlocked View Controller

您可以使用 let appDelegate = UIApplication.shared.delegate as? AppDelegate

访问应用委托

如果您不想设置为 rootViewControllerAccountlocked View Controller,请注销用户并将 rootViewController 设置为您应用的未登录用户登录屏幕并显示 Accountlocked View Controller.

您可以使用此扩展程序

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