当前位置: 首页 > 面试题库 >

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

桂鑫鹏
2023-03-14
问题内容

我知道如何使用 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* 传递信息 *


问题答案:

您应该使用该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


 类似资料:
  • 问题内容: 我正面临错误消息: 这是导致错误的代码 在Obj-C上可以这样使用: 我究竟做错了什么? 问题答案: 这似乎是由于子类模板中的问题。它带有该方法的一种版本,需要您解开序列。 将当前功能替换为: 这个版本隐式地解开了参数,所以应该没问题。

  • 问题内容: 我是新手,尝试快速创建UIColor类的扩展为 之后,我以以下方式访问该方法 我不知道该声明应作为参数传递给我。 问题答案: 您已经定义了一个 实例方法 ,这意味着您只能在一个实例上调用它: 发生编译器错误“缺少参数”是因为 实例方法是Swift中的Curried Function ,因此可以等效地称为 (但这是一件奇怪的事情,我添加它只是为了解释错误消息的来源。) 但是,您真正想要的

  • 问题内容: C和派生函数的入口点函数具有和(和)参数,但是Swift没有合适的参数:顶级代码只是代码,并且没有参数。 在Swift程序中,如何访问等价的? 问题答案: 进程 刚刚重命名为 CommandLine (自Swift 3.0 8月4日快照以来) (由于某些原因,变更日志中未提及)

  • 问题内容: 谁能看到世界上为什么不会调用didSelectRowAtIndexPath?我已经在代码和情节提要中对它进行了三重检查。 问题答案: Swift 3修改了方法的签名(很多方法,新的“规则” /样式) 替换 为 请注意,vs ,与您更新的其他对象(也采用了相同的“样式”)一样,但不是。 删除该行,然后让XCode进行自动补全。否则,您可以将其替换为文档中的那个。

  • 问题内容: 我有两个视图控制器,一个和两个。我从VC一到VC二。在VC 2上,我选择一些存储在数组中的数据。当我按下导航栏上的“返回”按钮时,我想将该阵列发送回VC One。 使用Swift和Storyboards做到这一点的最佳方法是什么? 谢谢! 问题答案: 如果要使用“完成”和“取消”按钮(有点像选择器)来显示模式视图,则在展开segue方法期间获取值可能是最简单的。 假定您要使用导航控制器

  • 问题内容: 在上面的代码中,我有2个问题:1)。它具有编译错误:’UINavigationController!’ 没有名为“ pushViewController”的成员 但是在该类中,确实有一个pushViewController方法。 2)。我必须添加注释:@objc(SEPushNoAnimationSegue),否则,在情节提要中,它只能识别随机生成的名称,例如_tcxxxxSEPush