Ios 当应用程序进入后台时,Swift UILabel为零(错误)
我有一些代码可以更改Ios 当应用程序进入后台时,Swift UILabel为零(错误),ios,iphone,swift,uilabel,viewdidload,Ios,Iphone,Swift,Uilabel,Viewdidload,我有一些代码可以更改UILabel的文本,当应用程序第一次运行时,它可以正常工作,但当我关闭它(应用程序转到后台)然后重新打开它时,UILabel是nil,无法再次设置文本 文本在viewdiload()函数中设置为UILabel,我在application函数中调用viewdiload()将进入前台再次将文本设置为UILabel,此时它崩溃,出现错误致命错误:在打开可选值时意外发现nil。我调试了它,找到的nil是UILabel 以下是AppDelegate.swift中的一些代码: func
UILabel
的文本,当应用程序第一次运行时,它可以正常工作,但当我关闭它(应用程序转到后台)然后重新打开它时,UILabel是nil
,无法再次设置文本
文本在viewdiload()
函数中设置为UILabel,我在application
函数中调用viewdiload()
将进入前台再次将文本设置为UILabel
,此时它崩溃,出现错误致命错误:在打开可选值时意外发现nil
。我调试了它,找到的nil
是UILabel
以下是AppDelegate.swift
中的一些代码:
func applicationWillEnterForeground(application: UIApplication) {
ViewController().refresh()
}
func refresh() {
self.viewDidLoad()
}
在ViewController.swift
中:
func applicationWillEnterForeground(application: UIApplication) {
ViewController().refresh()
}
func refresh() {
self.viewDidLoad()
}
你知道为什么当应用程序进入后台时,
UILabel
变为nil
吗?与其试图从应用程序代理中保存对视图控制器的引用,不如让视图控制器订阅前台输入事件-
在视图中添加以下内容
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("enteringForeground:"),
name: UIApplicationWillEnterForegroundNotification, object: nil)
将函数添加到ViewController
func enteringForeground(notification: NSNotification) {
// Whatever you need to do to refresh UI
// DO NOT CALL viewDidLoad
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
您不应显式调用viewDidLoad
viewwillbeen
等。如何在应用程序willenterforeground
中获取对视图控制器的引用?请在此方法中显示代码这里是函数func applicationWillEnterForeground(应用程序:UIApplication){ViewController().refresh()}
和ViewController:func refresh(){self.viewDidLoad()}
看起来您正在创建一个新的ViewController
,而不是获取对现有控制器的引用。这可以解释为什么标签是nil
。我想了解ViewController
是如何获取其值的(顺便说一下,它应该是ViewController
——变量以小写字母开头,类以大写字母开头)-我怀疑ViewController
的内容是您的故事板未实例化的实例,因此您的iboutlets得到nil。我建议您不要。您的视图控制器应该订阅应用程序激活时发布的事件-您应该在解除分配视图控制器之前删除观察者。从NSNotificationCenter文档中:“您必须在解除分配由addObserverForName:object:queue:usingBlock:
指定的任何对象之前调用removeObserver:
或removeObserver:name:object:
。”