您好我试图将一个对象从一个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?
答案 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知道它是否有效。