在 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 的建议,创建一个名为UIViewController
到 UIViewController
的转场并使用 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 视图?