我想知道标题中的函数如何工作以及sender参数。
让我们说按钮点击会调用performSegue方法,这也会调用prepareSegue方法吗?是在performSegue方法之前调用prepareSegue方法但是在按下按钮之后?
另外,两个函数中的“sender”参数是否已链接?如果我在performSegue方法中传入一个字符串作为发送者,那么是否会转移到prepareSegue方法中的sender参数?换句话说,如果我将performSegue方法中的sender参数设置为“Hi world”,那么prepareSegue方法中的sender参数是否也是相同的字符串?
由于
答案 0 :(得分:21)
实际上,有两种方法可以触发segue。第一个是通过Interface Builder中的UI元素执行操作,第二个是在代码中使用performSegueWithIdentifier:sender:
。我说有效',因为在幕后,当从故事板加载场景时,配置一个动作处理程序,最终调用performSegueWithIdentifier:sender:
调用performSegueWithIdentifier:sender:
时,会将segue对象传递给视图控制器的prepareForSegue:sender:
函数。
如果segue是由UI元素上的操作启动的,则发件人将是该UI元素(即,如果它是UIButton
上的操作连接,那么sender
将是UIButton
实例)。
如果您的代码调用performSegueWithIdentifier:sender:
启动了segue,那么sender
将是您作为sender
传递的任何对象。这可能是你的视图控制器,按钮,数组,任何东西。所以是的,如果你通过" Hello World"以performSegueWithIdentifier:sender:
作为sender
值,这将是sender
prepareForSegue:sender:
就操作顺序而言:
performSegueWithIdentifier:sender
由您的代码或UI元素上的操作调用shouldPerformSegueWithIdentifier:sender:
,则调用此函数。如果此函数返回false
,则取消segue prepareForSegue:sender:
,则调用此函数。prepareForSegue:sender:
返回,则segue完成。答案 1 :(得分:20)
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
}
}
请告诉我这是否有帮助!
答案 2 :(得分:5)
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
}
}
答案 3 :(得分: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(...)
}
}
答案 4 :(得分:0)
Swift 5的更新方法
performSegue(withIdentifier: "showNextViewController", sender: self)
注意:“ showNextViewController”是为情节提要中的segue添加的标识符
答案 5 :(得分:-1)
在通过使用带有标识符的执行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
}
}