【问题标题】:How to access segue in 'didSelectRowAtIndexPath'?如何访问“didSelectRowAtIndexPath”中的 segue?
【发布时间】:2015-07-10 13:50:14
【问题描述】:

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

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

传递信息无关

【问题讨论】:

  • 我没有得到问题,但是如果问题是如何将数据发送到 prepareForSegue,请使用 performSegueWithIdentifier 的 sender 字段
  • if ([segue.destinationViewController isKindOfClass:[A_VC class]]) {...} else {...}
  • 传递prepareForSegue中的信息是正确的做法。不过,您绝对不应该在 prepareForSegue 内调用 performSegueWithIdentifier
  • 看起来您已经使用let controller = segue.destination as... 行将信息传递给下一个视图控制器。您具体要做什么而不是在该功能中完成?如其他地方所述,请勿在 prepareForSegue 内调用 performSegueWithIdentifier
  • 伙计们,我正在尝试设置 控制器。 selectedQuestionnaire 在执行从 didSelectRowAtIndexPath 的转场时,但最后,它对我的​​目标控制器执行转场,但它没有在其中设置 selectedQuestionnaire 值,我认为这是因为我无法访问连接到源视图控制器的 segue 以在 prepareforSegue 函数中创建 DestinationViewController JUST LIKE。我希望这次我清楚了。

标签: ios uitableview swift segue


【解决方案1】:

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

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

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

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

【讨论】:

  • 我尝试了您的解决方案,但它在 let controller = (segue.destinationVIewController.... 线上给出了此错误。 无法将“UIViewController”(0x105866418) 类型的值转换为“CarePortal.QuestionnaireController”(0x1034f1850)。
  • 你可能为演员设置了错误的对象类型,你能检查并确保你投射的一切都是你所描述的吗?
  • as! 更改为 as? 成功了。谢谢@Nate。 Swift 对可选值真的越来越严格了:@
  • 是的,请记住,以后,设备必须知道您要执行转场,以便它知道做好准备 :)
  • 我有一个关于这个解决方案的问题。如果用户双击单元格(不小心),则 performSegue 将被触发两次。如何确保它只触发一次?
猜你喜欢
  • 2013-12-03
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多