在uiviews之间传输数据为零

时间:2017-11-16 20:58:25

标签: ios swift

您好我试图将一个对象从一个tableview控制器传递给另一个。 我正在使用prepare for segue和didselectRowAt函数:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.myDish = sections[indexPath.section].listofDishes?[indexPath.row]
    self.sectionName = sections[indexPath.section].sectionName!

    self.flag = 1
    performSegue(withIdentifier: "chooseDish", sender: self)
}



override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if self.flag != 0{
    let selectedDishTableViewController = segue.destination as! SelectedDishViewController
        selectedDishTableViewController.sectionName = self.sectionName
        selectedDishTableViewController.dish = self.myDish

        self.flag = 0
    }
}

我创建了标志因为在didselectrowat之前调用了preparefor segue

我确保在准备segue之前设置myDish和sectionName。

在我的第二个视图控制器中,我仍然将两个值都设为nil。

这就是我在第二个控制器中声明变量的方法

var dish:Dish?
var sectionName:String?

1 个答案:

答案 0 :(得分:1)

如果在didSelectRow ..之前调用prepareForSegue,那么它意味着segue已经发生,所以第二次强制调用它时,通过在didSelectRow中显式调用performSegue< - 它将被忽略为视图控制器已经被这些变量的空值所包围。

这里的解决方案是做这样的事情:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let indexPath = tableView.indexPathForSelectedRow {
        let selectedDishTableViewController = segue.destination as! SelectedDishViewController
        selectedDishTableViewController.dish = sections[indexPath.section].listofDishes?[indexPath.row]
        selectedDishTableViewController.sectionName = sections[indexPath.section].sectionName!
    }
}

你不需要在tableView中执行任何其他操作:didSelect ...为此,使用此... Lemme知道它是否有效。