在两个UIViewControllers之间使用UIStoryBoardSegue进行重复的segue处理

时间:2017-09-14 01:14:40

标签: ios swift storyboard segue delegation

我有两个屏幕。第一个是基于UITableView实例。当我点击单元格时,函数tableView(_:didSelectRowAt:)会触发:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    selectedEmg = selectedEmergencies[indexPath.row]
    performSegue(withIdentifier: "ShowMoreInfoAboutEmg", sender: self)
}

这是故事板:

storyboard

但事实上,segue " ShowMoreInfoAboutEmg" 重复自身和第二个屏幕。

enter image description here

我可以剪切performSegue(withIdentifier:sender:),屏幕之间的转换也能正常工作。但是,我需要将数据从UITableViewCell实例传输到远程UIViewController的属性。否则我得到这样的东西:

enter image description here

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
        }
}

2 个答案:

答案 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,然后点击代码中的选择时间,选择行。