簡體   English   中英

prepareForSegue和PerformSegueWithIdentifier發件人

[英]prepareForSegue and PerformSegueWithIdentifier sender

我想知道標題中的函數如何工作以及sender參數。

讓我們說單擊按鈕會調用performSegue方法,這也會調用prepareSegue方法嗎? 是在performSegue方法之前調用prepareSegue方法但是在按下按鈕之后?

另外,兩個函數中的“sender”參數是否相關聯? 如果我在performSegue方法中傳入一個字符串作為發送者,那么是否會轉移到prepareSegue方法中的sender參數? 換句話說,如果我將performSegue方法中的sender參數設置為“Hi world”,那么prepareSegue方法中的sender參數是否也是相同的字符串?

謝謝

實際上,有兩種方法可以觸發segue。 第一個是通過Interface Builder中UI元素的操作,第二個是在代碼中使用performSegueWithIdentifier:sender: 我說“有效”,因為在幕后,當從故事板加載場景時,配置一個動作處理程序,最終調用performSegueWithIdentifier:sender:

當調用performSegueWithIdentifier:sender: ,segue對象將被傳遞給視圖控制器的prepareForSegue:sender: function。

在通過UI元素上的動作啟動segue的情況下,發送者將是該UI元素(即,如果它是UIButton上的動作連接,則sender將是UIButton實例)。

如果您的代碼調用performSegueWithIdentifier:sender:發起segue,則sender將是您作為sender傳遞的任何對象。 這可能是你的視圖控制器,按鈕,數組,任何東西。 所以是的,如果你傳遞“Hello World”來執行performSegueWithIdentifier:sender:作為sender值,那么這將是prepareForSegue:sender:sender prepareForSegue:sender:

在操作順序方面:

  1. performSegueWithIdentifier:sender由您的代碼或UI元素上的操作調用
  2. 如果視圖控制器實現了shouldPerformSegueWithIdentifier:sender:則調用此函數。 如果此函數返回false則取消segue
  3. 創建segue對象和目標視圖控制器對象
  4. 如果視圖控制器實現prepareForSegue:sender:則調用此函數。
  5. 一旦prepareForSegue:sender: ,segue就完成了。

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
    }
}

如果這有幫助,請告訴我!

The_Curry_Man的回答對我有用。 這是他的Swift 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
    }
}

我的初學者兩分錢......在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(...)
    }

}

Swift 5的更新方法

performSegue(withIdentifier: "showNextViewController", sender: self)

注意:“showNextViewController”是在storyboard中為segue添加的標識符

通過使用帶有標識符的執行segue將任何對象發送到特定對象到另一個視圖控制器,請按照步驟#Swift4

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "Detailed_Live_poll"{
        let destinationNavigationController = segue.destination as! UINavigationController
        let targetController = destinationNavigationController.topViewController as! NewLivePollViewController
        targetController.dictQuestInf = sender as! NSDictionary
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM