如何在 '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
}
}
解释...
- 我使用索引路径作为发件人,所以我可以轻松传递索引路径。您还可以使用其他 UITableView 方法检查当前选定的单元格,但我总是以这种方式成功完成
- 你不能把
performSegueWithIdentifier
放在 prepare for segue 方法中,因为 performSegueWithIdentifier
导致 prepareForSegue
;你只是在没有目标的情况下转来转去。 (当你想执行segue时,prepareForSegue总是被执行)
prepareForSegue
不会 运行 在选中一行时。这是您需要 didSelectRowAtIndexPath
的地方。您需要一个 performSegueWithIdentifier
在前面描述的方法之外,它应该在 didSelectRowAtIndexPath
我知道如何使用来自 prepareForSegue 函数的 segues 传递数据,但是我有一个 TableViewCell,从中有两个可能的 segues 到两个不同的 ViewControllers (现在就说 A,B)。
有人建议 here 最好将 segues 连接到 View controller 而不是 tableCell 本身,这实际上工作得很好。但是我想在单击单元格时将信息传递给第二个视图控制器,那么如何访问我连接到源 ViewController.
的 segueoverride 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
}
}
解释...
- 我使用索引路径作为发件人,所以我可以轻松传递索引路径。您还可以使用其他 UITableView 方法检查当前选定的单元格,但我总是以这种方式成功完成
- 你不能把
performSegueWithIdentifier
放在 prepare for segue 方法中,因为performSegueWithIdentifier
导致prepareForSegue
;你只是在没有目标的情况下转来转去。 (当你想执行segue时,prepareForSegue总是被执行) prepareForSegue
不会 运行 在选中一行时。这是您需要didSelectRowAtIndexPath
的地方。您需要一个performSegueWithIdentifier
在前面描述的方法之外,它应该在didSelectRowAtIndexPath