在视图控制器之间设置变量

时间:2017-07-11 22:23:50

标签: swift viewcontroller

我是swift的新手,我正在尝试学习如何在视图控制器之间传递数据并使用firebase。这是我对新控制器的看法,它在我正在推动的视图控制器上设置一个变量。

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let viewController = storyboard?.instantiateViewController(withIdentifier: "UserInfoViewController") as! UserInfoViewController
    viewController.uidPassed = userUIDArray[indexPath.row]
    self.present(viewController, animated: true, completion: nil)
}

它转移到新控制器,我将变量声明为字符串。当我去运行它时,它崩溃了,说字符串是空的。我可以打印它,并且它在viewDidAppear方法中是空的,但是viewDidLoad方法它具有UID存储在变量中,当我在前一个控制器中单击时。我没有正确地将变量从一个视图控制器传递给另一个视图控制器吗?

    override func viewDidAppear(_ animated: Bool) {

    databaseRef.child("Users").child(self.uidPassed).child("Name").observe(.value, with: { (snapshot) in
        let name = snapshot.value as! String
        print(name)
    })

2 个答案:

答案 0 :(得分:1)

将数据从一个视图控制器传递到另一个视图控制器有两种主要方法。

首先,您可以将您的单元格与故事板中的目标视图控制器连接。在这种情况下,您将在storyboard中定义segue的类型,并且您需要在storyboard中定义segue的标识符。如果要传递数据,则需要在prepareForSegue方法中执行此操作,如此

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationViewController = segue.destination as? YourTableViewController {

        destinationViewController.texts = self.texts
        //...
    }
}

其次,您可以通过编程方式执行此操作,就像您在示例中尝试执行的操作一样。在这种情况下,您不应该在故事板中通过segue连接视图控制器。而是为目标视图控制器本身设置标识符。然后在代码中启动该控制器,将属性设置为启动的视图控制器对象,然后呈现它,就像您在示例中所做的那样。

希望有所帮助。

答案 1 :(得分:0)

这听起来像打字问题。似乎userUIDArray包含一个UID数组(不确定它是什么类型),并且您尝试将其分配给viewController.uidPassed,这听起来像是期待一个字符串。试试这个:

viewController.uidPassed = userUIDArray[indexPath.row] as! String

另一种选择是将uidPassed的类型更改为userUIDArray变量所持有的任何类型的值。