在 Swift 中以编程方式制作 Segue

Posted

技术标签:

【中文标题】在 Swift 中以编程方式制作 Segue【英文标题】:Make Segue programmatically in Swift 【发布时间】:2016-02-11 20:14:36 【问题描述】:

我有两个 VC:VC1 和 VC2。 在 VC1 中,我有一个 finish button 我以编程方式制作,还有一个 result array 我想传递给 VC2。

我知道如何在 Storyboard 中制作 Segue,但目前我不能这样做,因为 finish button 是通过程序制作的。

如果我想使用 segue 传递结果数组,有没有办法以编程方式制作 segue?如果这不可能,我是否应该只使用presentViewController 呈现VC2 并设置一个委托来传递result array

【问题讨论】:

您可以在界面生成器中创建一个从 VC1 到 VC2 的 segue,为其命名,然后从您绑定到按钮的操作中调用 performSegueWithIdentifier。然后,在prepareForSegue 中,输入if 语句,标识您正在使用的segue,获取您从VC1 传递的任何内容,将其分配给VC2 和BAM……您就完成了。跨度> 阿德里安,您应该将此作为答案发布,以便 OP 可以接受。这是 OPs 问题的正确答案。 【参考方案1】:

您可以按照此答案中的建议进行操作: InstantiateViewControllerWithIdentifier.

此外,我正在为您提供用 Swift 重写的链接答案中的代码,因为链接中的答案最初是用 Objective-C 编写的。

let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewController(withIdentifier: "identifier") as! SecondViewController

vc.resultsArray = self.resultsArray

编辑:

由于这个答案引起了一些关注,我想我为您提供了另一种更安全的方法。在上述答案中,如果带有 "identifier"ViewController 不是 SecondViewController 类型,应用程序将崩溃。在 Swift 中,您可以通过使用可选绑定来防止这种崩溃:

guard let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as? SecondViewController else 
    print("Could not instantiate view controller with identifier of type SecondViewController")
    return


vc.resultsArray = self.resultsArray
self.navigationController?.pushViewController(vc, animated:true)

如果ViewController 的类型为SecondViewController,则通过这种方式推送ViewController。如果无法强制转换为 SecondViewController,则会打印一条消息,并且应用程序仍保留在当前的 ViewController 上。

【讨论】:

由于 OP 询问如何从按钮操作创建转场,因此按照@AdrianB 的建议,创建一个名为 UIViewControllerUIViewController 的转场并使用 performSegueWithIdentifier 调用它似乎是一个更好的解决方案。 @DuncanC 提出了一个很好的观点,但 Dehlen 的解决方案也很有效 :) 我猜我学到了两种不同的方法。 嗨,这对我有用,但是现在当我单击取消导航返回时,它不起作用,知道可能出了什么问题吗? 您的意思是“取消”还是“返回”?您是否为“取消”操作定义了自己的 IBAction ?如果是这样,它看起来如何?【参考方案2】:

您仍然可以通过从 VC1 拖动到 VC2 来在 Interface Builder 中创建转场 - 只需从 VC 顶部的黄色小圆圈中拖动即可。在 IB 中给这个 segue 一个唯一的名字,在你的finish 函数中你可以调用performSegueWithIdentifier:,传入你的 segue 的名字,就是这样。在prepareForSegue 方法中,您可以通过访问segue.identifier 找出正在执行哪个segue,如果是有问题的segue,您可以获得指向segue.destinationViewController 的指针并以这种方式传递您的数据。

【讨论】:

以上是关于在 Swift 中以编程方式制作 Segue的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 在 iOS 中以编程方式进行 segue

在 Swift 中以编程方式从 MainViewController 切换到 .xib 视图?

在 Swift 中以编程方式创建 NSTextField

在单元测试中以编程方式执行 Unwind Segue

在Swift 3中以编程方式创建一个没有XIB的NSViewController

如何在Swift中以编程方式从另一个图像中剪切徽标的形状(png图像)?