我有一个简单的应用程序。将用户信息从1个视图控制器传递到另一个视图它成功打印出我的用户对象,我可以在控制台中看到数据,但是当我从对象中提取数据到我的视图中时它不显示
@IBOutlet weak var chatPartnerLabel: UILabel!
var user: User? {
didSet {
print(user) //This prints out all information fine
chatPartnerLabel.text = user?.firstName //This crashes the app because chatPartnerLabel.text is nil
}
}
override func viewDidLoad() {
super.viewDidLoad()
chatPartnerLabel.text = user?.firstName //This comes up as nil
}
我也试过硬编码标签以确定它是否正常工作
chatPartnerLabel.text = "My text" //Changes the label to My Text
我也尝试将user?.firstName
放在viewDidAppear中,viewWillAppear都显示空标签。
正如您在控制台中看到的,我的用户在那里有数据。我尝试设置时遇到的崩溃现在是nil
成功将chatPartnerLabel更改为名称或名字我做错了什么?
答案 0 :(得分:0)
class User {
var firstName = "fn"
}
///uiviewcontroller:
@IBOutlet weak var chatPartnerLabel: UILabel!
var user: User? {
didSet {
print(user) //This prints out all information fine
chatPartnerLabel.text = user?.firstName //This crashes the app
}
}
两个
override func viewDidLoad() {
super.viewDidLoad()
user = User()
和
override func viewDidLoad() {
super.viewDidLoad()
chatPartnerLabel.text = user?.firstName
的工作!我已经过测试了!
我们需要更多信息和正确的callstack。展开时chatPartnerLabel
可能是零。
答案 1 :(得分:0)
如果您在segue中设置user
或在推送/呈现控制器之前,它将崩溃,因为标签尚未实例化。这就是为什么你必须将代码重写为:
@IBOutlet weak var chatPartnerLabel: UILabel! {
didSet {
print(user?.firstName) // just for check
chatPartnerLabel.text = user?.firstName
}
}
var user: User? {
didSet {
print(user) //This prints out all information fine
}
}
答案 2 :(得分:0)
这适用于 Swift 3 。我添加了一个布尔控件来了解何时调用viewDidLoad。
var user: (firstName : String, lastName : String, controlView : Bool)? {
didSet {
if (self.user?.controlView)! {
print(user!)
chatPartnerLabel.text = user?.firstName
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
user?.controlView = true
}