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

setting variables between view controllers

我是 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)
    })

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

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

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

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

首先,您可以将单元格与情节提要中的目标视图控制器连接起来。在这种情况下,您将在故事板中定义 segue 的类型,并且您需要为故事板中的 segue 定义一个标识符。当你想传递数据时,你需要在prepareForSegue方法中进行,像这样

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

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

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

希望对您有所帮助。