Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当应用程序进入后台时,Swift UILabel为零(错误)_Ios_Iphone_Swift_Uilabel_Viewdidload - Fatal编程技术网

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:
。”