在Swift中以编程方式进行Segue

时间:2016-02-11 20:14:36

标签: ios swift segue

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

我知道如何在故事板中制作Segue,但是由于finish button是以编程方式制作的,所以我现在不能这样做。

如果我想使用segue传递结果数组,有没有办法以编程方式生成segue?如果无法做到这一点,我是否应该使用presentViewController呈现VC2并设置委托来传递result array

2 个答案:

答案 0 :(得分:28)

你可以像在这个答案中提出的那样做: InstantiateViewControllerWithIdentifier

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

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

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

修改

由于这个答案引起了一些关注,我想我会为你提供另一种更安全的方法。在上面的答案中,如果带有“标识符”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,则会推送SecondViewController。如果无法投放到ViewController,则会打印一条消息,并且该应用程序仍保留在当前def oddsquare(numbers): for n in numbers: if n % 2 == 1: print n**2 else: return "" while True: startingnumber1 = int(raw_input('Enter your starting number:')) endingnumber = int(raw_input('Enter your ending number:')) + 1 list1 = range(startingnumber1, endingnumber) oddsquare(list1) 上。

答案 1 :(得分:7)

您仍然可以通过从VC1拖动到VC2来在Interface Builder中创建segue - 只需从/向上拖动到VC顶部的黄色小圆圈即可。在IB中为此segue指定一个唯一的名称,在finish函数中,您可以调用performSegueWithIdentifier:,传递您的segue的名称,以及它的名称。在prepareForSegue方法中,您可以通过访问segue.identifier找出正在执行的segue,如果它是相关的segue,您可以获得指向segue.destinationViewController的指针并通过您的这样的数据。