即使没有传递,Swift5数据传递也为Nil

时间:2019-09-24 14:30:31

标签: ios swift xcode swift5.1

我在Swift中遇到了一个奇怪的问题。

这与在视图控制器之间传递数据的其他问题有关,但是这里的区别在于,这旨在传递从'didSelectRowAt'方法加载的简单对象。

选择行时,我正在从表视图控制器传递数据。数据作为对象传递,当我尝试从中分配值时,我可以打印数据并在理事会BUT中查看它,这令人恐惧:“意外发现nil,而隐式展开一个Optional值”错误。不确定我在这里缺少什么!

从表视图控制器A:

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        performSegue(withIdentifier: "existingStudentSegue", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destinationVC = segue.destination as! StudentDetailTableViewController

        if let indexPath = tableView.indexPathForSelectedRow {
            destinationVC.selectedStudent = studentsArray?[indexPath.row]
        }
    }

由表视图控制器B接收:

    var selectedStudent: Students? {
        didSet {

            print("DATA RECEIVED: \(String(describing: selectedStudent))")
            print("DATA TYPE: \ (type(of: selectedStudent))")
            firstNameText.text = selectedStudent?.firstName

            }
        }

“打印”语句显示我输入的测试数据,而“类型”显示我设置的学生班级,如下所示。

DATA RECEIVED: Optional(Students {created = 2019-09-24 12:07:23 +0000; name = Anna Altitude; ...(it's all here)
DATA TYPE: Optional<Students>

当我尝试在Table View Controller B中的文本字段中显示文本时,代码失败。我在调用堆栈中看到,selectedStudent的数据为空。但是那怎么可能呢?该对象已填充并且可以访问。

1 个答案:

答案 0 :(得分:1)

将此内容添加到viewDidLoad

firstNameText.text = selectedStudent?.firstName

问题是当didSet触发firstNameText为零时,因为尚未加载vc