从控制器外部显示视图控制器,未传递自引用

时间:2018-08-31 10:19:08

标签: ios viewcontroller

我有一个应用程序,其中有管理员和普通用户,管理员可以在其中删除用户。删除用户后,我需要显示您已被删除。我从服务器那里得到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) 

在所有视图控制器中,功能中都存在Accountlocked View Controller

我是否可以直接显示当前视图控制器引用的帐户锁定视图控制器,还是可以获取我发现的该值,但是

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

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

感谢您的任何帮助

2 个答案:

答案 0 :(得分:0)

您应先注销用户,然后将window?.rootViewController设置为Accountlocked View Controller

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

访问应用程序委托

如果您不想将rootViewController设置为Accountlocked View Controller,请注销用户并将rootViewController设置为应用程序的未登录用户登录屏幕,并显示{{1 }}。

答案 1 :(得分:0)

您可以使用此扩展名

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