在Swift3中传递数据

时间:2017-02-04 14:41:51

标签: ios swift swift3 uitabbarcontroller

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

    //need this to give the category which is clicked to the main view controller 
    // so its sends the data from one tableview to the other
    let categories =  cat[indexPath.row]
    cellText = categories.cat!
    let choosenCategory = cellText
    self.performSegue(withIdentifier: "goToTableView", sender: choosenCategory)
    let user = "Anton"
    self.performSegue(withIdentifier: "goToTableView", sender: user)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "goToTableView")
    {
        let destination = segue.destination as? ViewController

        destination?.passedData = sender as? String
        print("open second one")
        destination?.passedUser = sender as? String
        print("Sender Vlaue: \(sender)")
    }
}
嘿,那里! 我需要一些帮助。我想在tableviewcontroller s。

之间传递数据

我的问题是,当我在这两者之间传递数据时,它会打开两次。因此,首先它会Controller加载passedData,然后加载passedUser

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的问题是您要拨打performSegue(withIdentifier:sender:)两次。每次调用都会创建一个新的目标viewController。您需要在一次通话中传递设置数据。

一种选择是更新viewController中的属性以保存值,而不是将数据作为sender发送。

另一种方法是创建一个结构来保存值。如果您有各种类型的变量,这将很有效。

由于您只有两段数据而且它们都是String,因此您可以在[String]中传递这些数据:

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

    //need this to give the category which is clicked to the main view controller 
    // so its sends the data from one tableview to the other
    let categories =  cat[indexPath.row]
    cellText = categories.cat!
    let choosenCategory = cellText
    let user = "Anton"
    self.performSegue(withIdentifier: "goToTableView", sender: [chosenCategory, user])
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToTableView"
    {
        guard let destination = segue.destination as? ViewController else { return }
        guard let info = sender as? [String] else { return }

        destination.passedData = info[0]
        destination.passedUser = info[1]
        print("Sender Value: \(sender)")
    }
}