这是呈现下一个VC的代码:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("dismiss completed")
let user = self.users[indexPath.row]
performSegue(withIdentifier: "toNewMessage", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let indexPath = tableView.indexPathForSelectedRow
var vc = segue.destination as! ChatLogController
vc.user = self.users[(indexPath?.row)!]
}
这是从先前的VC获取数据的变量:
var user: User? {
didSet {
print(user?.name)
chatLogTitleLabel.text = user?.name
}
}
它说当我尝试设置标签的文本时发现一个nil值,但是当我打印它时,它是正确的值,而不是nil。我该如何解决?
答案 0 :(得分:0)
删除didSet
并将其设置在viewDidLoad
chatLogTitleLabel.text = user?.name
问题是这个
vc.user = self.users[(indexPath?.row)!]
触发将此时设置为nil的标签设置为n,直到所有端口都为nil,直到加载/展示vc为止
答案 1 :(得分:0)
在调用prepare(for:sender:)
内部的代码时,插座没有连接。您需要在标签后放置text
的标签,例如在viewDidLoad
var user: User?
override func viewDidLoad() {
super.viewDidLoad()
chatLogTitleLabel.text = user?.name
}
无论如何,当您执行segue时,您可以将选定的User
作为sender
传递,然后在prepare(for:sender:)
中低调显示
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "toNewMessage", sender: users[indexPath.row])
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toNewMessage" {
var vc = segue.destination as! ChatLogController
vc.user = sender as! User
}
}
答案 2 :(得分:0)
这是由于
var user: User? {
didSet {
print(user?.name)
chatLogTitleLabel.text = user?.name
}
}
您正在初始化chatLogTitleLabel.text
的值。
您必须在加载视图后执行此操作。在viewDidLoad
/ viewWillApper
或viewDidAppear
中。或在将值分配给user
之前加载下一个控制器的视图。
答案 3 :(得分:0)
正如其他人所说,发生这种情况是因为尚未加载视图和所有出口。您可以通过在viewDidLoad中设置标签文本来解决此问题,或者可以将视图(如果尚未加载)加载到didSet中,如下所示:
var user: User? {
didSet {
loadViewIfNeeded()
chatLogTitleLabel.text = user?.name
}
}