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
我做错了什么?
3条答案
按热度按时间np8igboo1#
不,没有任何东西“坏了”。你才是做错的人。在你调用
newVC.passedText = "some abstract text"
时,newVC
还没有加载它的视图,它的插座仍然是nil
。所以调用setmyLabel.text
发生在插座确实仍然是nil
的时候。你的错误是你试图配置
myLabel
太快。存储值在newVC
中,是的。但至于设置myLabel.text
,等到viewDidLoad
,当视图和插座工作。因此,正确的模式如下所示:
现在,无论 *
passedText
何时相对于viewDidLoad
设置,您的代码都会执行正确的操作。fv2wmkja2#
你需要在故事板的视图控制器的标识检查器中设置定制类
NewViewController
,也许你忘了这么做?ckx4rj1h3#
当我从SceneDelegate初始化我的UIViewController时,如果我像这样初始化我的UIView控制器,我会遇到同样的问题:
@IBOutlet变量在viewDidLoad函数中为空,但如果我使用如下脚本初始化它:
然后,所有**@IBOutlet变量将在viewDidLoad**函数中初始化。