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
设置的。
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
设置的。