我有两个VC:VC1和VC2。
在VC1中,我有一个finish button
我以编程方式制作,result array
我想传递给VC2。
我知道如何在故事板中制作Segue,但是由于finish button
是以编程方式制作的,所以我现在不能这样做。
如果我想使用segue传递结果数组,有没有办法以编程方式生成segue?如果无法做到这一点,我是否应该使用presentViewController
呈现VC2并设置委托来传递result array
?
答案 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
的指针并通过您的这样的数据。