使用didSelectRowAt通过segue传递数据

时间:2019-03-02 18:37:17

标签: ios swift uitableview segue

我想通过segue将数据从UITableViewController传递到ViewController。问题是我要传递indexPath.row值(即UITableView中选择的行)的数据。

我已经在ViewController中声明了一个变量var counter: Int?,该变量称为foodinfo。这是我在UITableView中的代码:

var rowselected: Int?

override func viewDidLoad() {
    super.viewDidLoad()

}

//what happens when row is selected
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    rowselected = indexPath.row

    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destinationVC = segue.destination as! foodinfo
        destinationVC.counter = rowselected
    }

    self.performSegue(withIdentifier: "dayx", sender: self)
    }

由于某种原因,ViewController中的counter的值为nil。我在做什么错了?

2 个答案:

答案 0 :(得分:1)

您的prepare for segue不应放在override func tableView(的内部,因此应这样移动:

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

rowselected = indexPath.row
self.performSegue(withIdentifier: "dayx", sender: self)

}

也应该被覆盖:

   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     if segue.identifier == "dayx" {
    let destinationVC = segue.destination as! foodinfo
    destinationVC.counter = rowselected
    }
}

因为在override func prepareForSegue之后调用了self.performSegue方法。因此,现在您可以在rowSelected = indexPath.row内成功设置值override func tableView(,并且在调用self.performSegue时它将正确传递override func prepareForSegue

中设置的数据

答案 1 :(得分:0)

prepareForSegue应该在didSelectRowAt之外,无需声明可以使用sender

的变量。
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {  
    self.performSegue(withIdentifier: "dayx", sender:indexPath.row)
}      
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let destinationVC = segue.destination as! foodinfo
    destinationVC.counter = sender as! Int
}