2016-02-11 79 views
15

我有兩個VC:VC1和VC2。 在VC1中,我有一個finish button,這是我編程創建的,我想要傳遞給一個result array在Swift中編程Segue

我知道如何使故事板中的Segue,但我不能這樣做,因爲finish button是以編程方式製作的。

如果我想使用segue傳遞結果數組,有沒有一種方法讓編程的segue?如果這是不可能的,我應該使用presentViewController來呈現VC2,並設置一個代表通過result array

+6

您可以在VC1到VC2的接口生成器中創建一個名爲segue的名稱,然後從綁定到該按鈕的操作中調用performSegueWithIdentifier。然後,在'prepareForSegue'中,輸入你正在使用的segue的'if'語句,抓住你從VC1傳遞的任何內容,將它分配到VC2和BAM上......完成了。 – Adrian

+0

阿德里安,你應該發佈這個答案,以便OP可以接受它。這是OP問題的正確答案。 –

回答

26

你可以這樣做: 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類型,則應用程序將崩潰。在斯威夫特您可以通過使用可選的結合防止這種崩潰:

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) 

這樣,如果它是SecondViewController類型的ViewController推。如果無法輸出到SecondViewController,則會打印一條消息,並且該應用程序保留在當前的ViewController上。

+0

由於OP正在詢問如何從按鈕動作創建segues,因此按照@AdrianB的建議,創建一個名爲'UIViewController'的'UIViewController'繼承並使用performSegueWithIdentifier調用它,這看起來是一個更好的解決方案。 –

+0

@DuncanC提出了一個很好的觀點,但德倫的解決方案也在努力:)我學會了兩種不同的方式。 – Kahsn

+0

嗨,這工作對我來說,但現在當我點擊取消導航,它不起作用,任何想法可能是錯誤的? –

6

您仍然可以在界面生成器中通過從VC1拖動到VC2來創建細分 - 只需將鼠標拖放到VC頂部的小黃圈即可。在IB中給這個segue一個唯一的名字,並且在你的finish函數中你可以調用performSegueWithIdentifier:,傳入你的segue的名字,就是這樣。在prepareForSegue方法中,您可以通過訪問segue.identifier找出正在執行哪個分析,如果是問題分析,則可以獲得指向segue.destinationViewController的指針並以此方式傳遞數據。