IBOutlet 未初始化

IBOutlet is not initialized

xcode 有点奇怪。突然,普通的流程被打破了。为了检查它,我创建了一个只有两个 viewController 的新项目。第一个(名为 ViewController)仅包含一个用于打开第二个(名为 NewViewController)控制器的按钮,其中包含唯一的 UILabel。

import UIKit

class ViewController: UIViewController {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "Show New View" {
            guard let newVC = segue.destination as? NewViewController else { return }

            newVC.passedText = "some abstract text"
        }
    }
}

import UIKit

class NewViewController: UIViewController {
    @IBOutlet weak var myLabel: UILabel!

    var passedText: String? {
        didSet {
            guard let text = passedText else { return }

            myLabel.text = text
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

the main.storyboard looks so

IBOutlet is well connected

But the debugger shows what the UILabel is nil

我做错了什么?

您需要在情节提要中的视图控制器的身份检查器中设置自定义 class NewViewController。也许你忘了这样做?

没有,什么都没有"broken"。你是那个做错了的人。在您调用 newVC.passedText = "some abstract text" 时,newVC 尚未加载其视图,其出口仍为 nil。因此,设置 myLabel.text 的调用发生在出口确实仍然是 nil.

的时候

您的错误是您试图过早地配置 myLabel。将值存储在newVC中,是的。但至于设置myLabel.text,等到viewDidLoad,当视图和插座工作时。

因此,正确的模式如下所示:

var passedText: String? {
    didSet {
        guard let text = passedText else { return }
        myLabel?.text = text
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    guard let text = passedText else { return }
    myLabel?.text = text
}

现在,无论 何时 passedText 是相对于 viewDidLoad 设置的。