![](/img/trans.png)
[英]prepareForSegue is not called after 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:
在操作順序方面:
performSegueWithIdentifier:sender
由您的代碼或UI元素上的操作調用 shouldPerformSegueWithIdentifier:sender:
則調用此函數。 如果此函數返回false
則取消segue prepareForSegue:sender:
則調用此函數。 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.