我有一个名为ViewController的ViewController 我有一个名为AppDelegate的AppDelegate
它们不是以编程方式制作的,当您在swift中创建新应用时,它们就像默认设置一样。
想象一下,在ViewController中我有:
class ViewController: UIViewController {
var animal = "dog"
}
例如,我想在应用程序进入后台时打印动物值。所以在AppDelegate我有:
func applicationDidEnterBackground(_ application: UIApplication) {
var ViewController: ViewController!
print("animal = \(myViewController.animal)")
}
我收到:致命错误:在展开“可选”值时意外发现nil
如何从AppDelegate访问该值? PS:我试过google / StackOverflow的前两页
答案 0 :(得分:4)
您需要获取rootViewController
func applicationDidEnterBackground(_ application: UIApplication) {
let viewController = self.window?.rootViewController as? ViewController
print(viewController?.animal)
}
答案 1 :(得分:2)
您可以在rootViewController
中获取AppDelegate
,但无法确定在转到背景时是否是可见的视图控制器而您可能最终会在另一个{{1} }}
实现所需内容的最佳方式是在ViewController
中添加该功能,并为观察者分配ViewController
通知
当取消初始化控制器时,您需要删除观察者
像
这样的东西UIApplicationDidEnterBackground
答案 2 :(得分:0)
所有选项从nil
开始 - 无论您初始化它们还是将其默认设置为其他选项。现在,问问自己我在哪里初始化我的ViewController实例?嗯,你没有!
var ViewController: ViewController!
上面的行仅表示ViewController是类型 ViewController
的,尽管它也从一开始就被解包(但仍未初始化)。
var ViewController = ViewController()
现在这一行意味着ViewController 已初始化,带有ViewController 初始值设定项。看=
?请参阅()
。 ()
就像做/初始化一样。
所以错误告诉你的是,你是在发消息,但它仍然是nil
。如果你初始化它,那么你可以访问它的属性。
说完了,这不会在视觉上呈现新实例化的viewController。要做到这一点,你必须做类似的事情:
let vc = ViewController()
self.window?.rootViewController = vc
但是,正如rmaddy在评论中提到的那样,这是一个坏主意。另一种方法是简单地将现有的rootViewController转换为ViewController。
let viewController = self.window?.rootViewController as? ViewController
记得施展你必须使用as?
(安全施法)或as!
(强制施放)