Ios Set-UILabel from函数:在展开可选值时意外发现nil

Ios Set-UILabel from函数:在展开可选值时意外发现nil,ios,swift,xcode,uilabel,Ios,Swift,Xcode,Uilabel,我在AppDelegate.swift中的didfishlaunchingwithoptions()中有此代码: ViewController().changeLabel() 在我的ViewController.swift中,我有以下代码: @IBOutlet var myLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() // myLabel.text = "Hel

我在
AppDelegate.swift中的
didfishlaunchingwithoptions()
中有此代码:

ViewController().changeLabel()
在我的
ViewController.swift
中,我有以下代码:

    @IBOutlet var myLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
//        myLabel.text = "Hello, I'm in viewDidLoad."
    }
    func changeLabel() {
        print("I'm the test.")
        myLabel.text = "Hello, I'm in printSomething."
    }
myLabel.text=“您好,我在viewDidLoad中。”
viewDidLoad()中的
正在工作<代码>打印(“我就是测试对象”)
中的
changelab()
也在工作

但是对于
myLabel.text=“你好,我正在打印一些东西。”
changelab()
中,我总是遇到以下错误:

线程1:致命错误:在展开文件时意外发现nil 可选值


为什么它在
viewdiload()
中工作,而不是在我的函数中工作?

因为你的
UILabel
是在故事板nib文件中定义的,如果你调用
ViewController().changelab()

这个

意味着一个新的VC在运行中创建,因为您必须像

let vc = storyboard.instantiate ///////
因为它在故事板中,所以上面的代码只有在vc是以编程方式创建的情况下才有效,所以您必须在里面进行任何修改,比如
viewDidLoad
,但是如果必须这样做,您可以在调度之后在内部使用此代码

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
   let vc = self.window!.rootViewController as! ViewController
   vc.changeLabel()
}

这也将崩溃,因为VC尚未加载以调用changeLabel,其中包含myLabel.text,此时myLabel为零
let vc = storyboard.instantiate ///////
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
   let vc = self.window!.rootViewController as! ViewController
   vc.changeLabel()
}