IBOutlet未初始化

时间:2018-02-07 19:17:22

标签: ios swift xcode iboutlet

xcode有些奇怪。突然间,普通的流动被打破了。为了检查它,我创建了一个只有两个viewControllers的新项目。 First(名为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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

不,没有任何“破碎”。你是那个做错了的人。当您致电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
}

现在,无论 passedTextviewDidLoad相关时,您的代码都是正确的。

答案 1 :(得分:0)

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