从swift中的app delegate访问视图控制器的当前实例?

har*_*ins 6 ios swift

我的视图控制器有许多初始化的方法和变量.当我的应用程序进入后台时,我需要从app delegate访问视图控制器中的特定值.

我试图在app委托中执行此操作:

vc = ViewController()
Run Code Online (Sandbox Code Playgroud)

...但是这会产生一个新实例,并且值基本上设置为新的.

leo*_*loo 5

您有两个选择,第二个在设计上更好。

第一个选项:(你想要什么)

我不知道你的视图控制器的结构,所以让我假设你有一个根视图控制器,你可以AppDelegate通过以下方式获得它:

rootVC = self.window?.rootViewController
Run Code Online (Sandbox Code Playgroud)

如果你想从根视图控制器获取呈现的视图控制器(像许多应用程序一样,呈现的视图控制器是一个标签栏控制器):

guard let tabBarController = rootVC.presentedViewController as? TabBarController else {
        return
}
Run Code Online (Sandbox Code Playgroud)

获得标签栏控制器后,您可以在视图控制器数组中找到视图控制器:

tabBarController.viewControllers
Run Code Online (Sandbox Code Playgroud)

本质上,我想说的是,您必须从根目录开始跳过视图控制器以到达您想要的控制器,然后从那里获取变量。这很容易出错,通常不推荐。

第二种选择(更好的做法):

让您的视图控制器注册为UIApplicationWillResignActiveNotification通知的观察者。当您的应用程序即将进入后台时,这将允许您从视图控制器中执行任何您想要的操作。