2016-06-14 29 views
5

我想知道如何在標題的功能工作,還有發件人參數。prepareForSegue和PerformSegueWithIdentifier發件人

可以說按鈕點擊調用performSegue方法,那麼也調用prepareSegue方法嗎? prepareSegue方法在執行performSegue方法之前調用,但在按下按鈕之後?

此外,兩個函數鏈接的「發件人」參數?如果我在performSegue方法中傳入一個字符串作爲發送者,是否將轉移到prepareSegue方法中的sender參數?換句話說,如果我將performSegue方法中的sender參數設置爲「Hi world」,prepareSegue方法中的sender參數是否也是相同的字符串?

謝謝

回答

16

實際上,有兩種方法可以觸發segue。第一個是通過對Interface Builder中的UI元素的操作,第二個是在您的代碼中使用performSegueWithIdentifier:sender:。我說「有效」,因爲蓋,當場景從故事板加載下一個行動處理器配置,最終調用performSegueWithIdentifier:sender:

performSegueWithIdentifier:sender:被調用時,SEGUE對象被傳遞到您的視圖控制器的prepareForSegue:sender:功能。

在的情況下SEGUE由UI元素上的動作發起則發送者將是UI元素(即,如果它是在UIButton的動作連接,則sender將是UIButton實例)。

如果通過調用performSegueWithIdentifier:sender:的代碼啓動了繼續,那麼sender將作爲sender傳遞的任何對象。這可能是你的視圖控制器,按鈕,數組,任何東西。所以,是的,如果你傳遞的「Hello World」,以performSegueWithIdentifier:sender:sender值,那麼這將是操作順序的senderprepareForSegue:sender:

在術語:

  1. performSegueWithIdentifier:sender被調用時,無論是你的代碼或作爲UI元素上的操作的結果
  2. 如果您的視圖控制器實現了shouldPerformSegueWithIdentifier:sender:,則調用此函數。如果這個函數返回false那麼SEGUE被取消
  3. 的賽格瑞對象和目標視圖控制器對象被創建
  4. 如果您的視圖控制器然後實現prepareForSegue:sender:這個函數被調用。
  5. 一旦prepareForSegue:sender:返回,則繼續完成。
+0

感謝這個更新時,它救了我一點點回溯 - 我需要知道,如果prepareForSegue仍然會獨立檢查shouldPerformSegue的返回值的調用。 – MandisaW

15

performSegue方法調用segue從一個視圖執行到另一個視圖。在segue實際發生之前,prepareForSegue方法被調用,如果你想在視圖之間傳遞數據,你可以在那裏做。

performSegue方法不接受你想發送的參數。它只是用於首先調用segue。您要發送的任何數據都將通過prepareForSegue完成。

下面是一個例子。

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 

    performSegueWithIdentifier("test", sender: self) 
    //You can set the identifier in the storyboard, by clicking on the segue 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "test"{ 
     var vc = segue.destinationViewController as! RandomViewController 
     vc.data = "Data you want to pass" 
     //Data has to be a variable name in your RandomViewController 
    } 
} 

讓我知道這是否有幫助!

+0

你可以在'performSegueWithIdentifier:sender:'中將你想要發送的數據作爲'sender'發送出去,但是你需要將它傳遞給'prepareForSegue:sender:'中的目標視圖控制器。 – Paulw11

2

我的兩分錢,適合初學者...在SWIFT 3:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

} 

所以,如果到達控制器(類myController的)實現了 「fillData」 的方法:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if let destController = segue.destination as MyController{ 

     destController.fillData(...) 
    } 

} 
2

The_Curry_Man的答案爲我工作。下面是他的代碼爲雨燕3.

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 

    performSegue(withIdentifier: "test", sender: self) 
    //You can set the identifier in the storyboard, by clicking on the segue 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "test"{ 
     var vc = segue.destinationViewController as! RandomViewController 
     vc.data = "Data you want to pass" 
     //Data has to be a variable name in your RandomViewController 
    } 
} 
相關問題