我有两个屏幕。第一个是基于UITableView实例。当我点击单元格时,函数tableView(_:didSelectRowAt:)
会触发:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedEmg = selectedEmergencies[indexPath.row]
performSegue(withIdentifier: "ShowMoreInfoAboutEmg", sender: self)
}
这是故事板:
但事实上,segue " ShowMoreInfoAboutEmg" 重复自身和第二个屏幕。
我可以剪切performSegue(withIdentifier:sender:)
,屏幕之间的转换也能正常工作。但是,我需要将数据从UITableViewCell
实例传输到远程UIViewController
的属性。否则我得到这样的东西:
prepare(for:sender:)
在tableView(_:didSelectRowAt:)
之前开始工作,远程视图控制器从单元格获取nil对象。任何提示,伙计们?
简单实用的UITableView属性indexPathForSelectedRow
。
我没有触及我的故事板,但我完全删除了tableView(_:didSelectRowAt:)
实施,只添加了一行。它足以完全使用prepare(for:sender:)
。一般实现如下:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "SomeCustomIdentifier" {
guard let remoteViewController = segue.destination as? CustomViewController else {
fatalError("CustomViewController instance is not found ")
}
selectedItem = items[(self.customTableView.indexPathForSelectedRow?.row)!]
remoteViewController.selectedItemFromTable = selectedItem
}
}
答案 0 :(得分:0)
也许会更简单:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedEmg = selectedEmergencies[indexPath.row]
if let vc = storyboard?.instantiateViewController(withIdentifier: "EmgDetailsPresenter") as? EmgDetailsPresenter {
vc.selectedEmgFromTable = selectedEmg
navigationController?.pushViewController(vc, animated: true)
}
}
P.S。不要忘记在故事板中删除segue并将Storyboard ID
添加到EmgDetailsPresenter
答案 1 :(得分:0)
所以基本上你从代码中调用didselectrow,并从故事板中的单元格调用segue。删除链接Showmoreinfoaboutemg中的单元格的segue。然后从整个showmoreinforaboutemg viewcontroller创建一个segue到它应该去的那个。给它相同的重用标识符并解决问题
编辑:问题是你在故事板上点击一次两次调用segue,然后点击代码中的选择时间,选择行。