一尘不染

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

swift

我知道如何使用 prepareForSegue函数中的segues传递数据,但是我有一个TableViewCell,从那里有两个可能的segues到两个不同的ViewControllers(现在让我们说A,B)。在这里建议最好将segues连接到View控制器,而不是将tableCell本身连接​​,事实如此,效果很好。但是我想在单击单元格时将信息传递给第二个View控制器,因此如何访问我连接到SourceViewController的 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* 传递信息 *


阅读 238

收藏
2020-07-07

共1个答案

一尘不染

您应该使用该didSelectRowAtIndexPath方法来确定是否选择了一个单元格。

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. 我使用索引路径作为发送者,因此可以轻松地传递索引路径。您也可以使用其他UITableView方法检查当前选定的单元格,但我总是以这种方式成功完成此操作
  2. 您不能放入performSegueWithIdentifier“准备segue”方法中,因为它performSegueWithIdentifier会导致prepareForSegue;您只是在无目的地循环。(当您要执行segue时,始终执行prepareForSegue)
  3. prepareForSegue选择行时,它不会自行运行。这是您需要的地方didSelectRowAtIndexPath。您需要performSegueWithIdentifier前面所述方法的外部,应该在didSelectRowAtIndexPath
2020-07-07