如何在 'didSelectRowAtIndexPath' 中访问 segue?

How to access segue in 'didSelectRowAtIndexPath'?

我知道如何使用来自 prepareForSegue 函数的 segues 传递数据,但是我有一个 TableViewCell,从中有两个可能的 segues 到两个不同的 ViewControllers (现在就说 A,B)。

有人建议 here 最好将 segues 连接到 View controller 而不是 tableCell 本身,这实际上工作得很好。但是我想在单击单元格时将信息传递给第二个视图控制器,那么如何访问我连接到源 ViewController.

segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if segue.identifier == "showQuestionnaire"{
    if let indexPath = self.tableView.indexPathForSelectedRow() {
      let controller = (segue.destinationViewController as! UINavigationController).topViewController as! QuestionnaireController
      let patientQuestionnaire = patientQuestionnaires[indexPath.row] as! PatientQuestionnaire
      controller.selectedQuestionnaire = patientQuestionnaire
      self.performSegueWithIdentifier("showQuestionnaire", sender: self)
    }
  }
}

再说一次:这个问题与通过 prepareForSegue

传递信息无关

您应该使用 didSelectRowAtIndexPath 方法来确定是否选择了一个单元格,并将 indexPath 作为 segue 的发送者发送:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("showQuestionnaire", sender: indexPath);
}

然后在您的 prepareForSegue 方法中,从 sender 参数中获取 indexPath 并使用它来传递正确的 row/data:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "showQuestionnaire") {
        let controller = (segue.destinationViewController as! UINavigationController).topViewController as! QuestionnaireController
        let row = (sender as! NSIndexPath).row; //we know that sender is an NSIndexPath here.
        let patientQuestionnaire = patientQuestionnaires[row] as! PatientQuestionnaire 
        controller.selectedQuestionnaire = patientQuestionnaire
    }
}

解释...

  1. 我使用索引路径作为发件人,所以我可以轻松传递索引路径。您还可以使用其他 UITableView 方法检查当前选定的单元格,但我总是以这种方式成功完成
  2. 你不能把 performSegueWithIdentifier 放在 prepare for segue 方法中,因为 performSegueWithIdentifier 导致 prepareForSegue;你只是在没有目标的情况下转来转去。 (当你想执行segue时,prepareForSegue总是被执行)
  3. prepareForSegue 不会 运行 在选中一行时。这是您需要 didSelectRowAtIndexPath 的地方。您需要一个 performSegueWithIdentifier 在前面描述的方法之外,它应该在 didSelectRowAtIndexPath