从另一个viewController传递的变量的Xcode设置标签的文本导致崩溃

时间:2019-03-18 12:25:40

标签: swift xcode uitableview

这是呈现下一个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。我该如何解决?

4 个答案:

答案 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 / viewWillApperviewDidAppear中。或在将值分配给user之前加载下一个控制器的视图。

答案 3 :(得分:0)

正如其他人所说,发生这种情况是因为尚未加载视图和所有出口。您可以通过在viewDidLoad中设置标签文本来解决此问题,或者可以将视图(如果尚未加载)加载到didSet中,如下所示:

var user: User? {
    didSet {
        loadViewIfNeeded()
        chatLogTitleLabel.text = user?.name
    }
}