如何在'didSelectRowAtIndexPath'中访问segue – Swift / IOS

我知道如何使用prepareForSegue函数中的segues来传递数据,但是我有一个TableViewCell,从两个不同的ViewController有两个可能的Segges(现在我们只是说A,B)。 在这里build议最好将Segges连接到View控制器,而不是tableCell本身,这实际上是完美的。 但是我想传递信息到第二个视图控制器单元格单击时,所以如何访问我连接到Source ViewController的Segue。

码:

里面prepareForSegue

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方法来确定是否select了单元格。

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

然后在你的prepareForSegue方法中

 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. 我使用索引path作为发件人,所以我可以轻松地通过索引path。 你也可以使用其他UITableView方法来检查当前选中的单元格,但是我一直以这种方式成功完成
  2. 因为执行performSegueWithIdentifier导致prepareForSegue ,你不能把执行performSegueWithIdentifier放在准备segue方法内, 你只是循环,没有目标。 (当你想执行一个segue时,prepareForSegue总是被执行)
  3. 当一行被选中时, prepareForSegue不会自行运行。 这是你需要didSelectRowAtIndexPath 。 如前所述,您需要在方法外执行一个performSegueWithIdentifier ,它应该在didSelectRowAtIndexPath