prepareForSegue和PerformSegueWithIdentifier发件人

Jas*_*onP 6 iphone storyboard ios segue swift

我想知道标题中的函数如何工作以及sender参数.

让我们说单击按钮会调用performSegue方法,这也会调用prepareSegue方法吗?是在performSegue方法之前调用prepareSegue方法但是在按下按钮之后?

另外,两个函数中的"sender"参数是否相关联?如果我在performSegue方法中传入一个字符串作为发送者,那么是否会转移到prepareSegue方法中的sender参数?换句话说,如果我将performSegue方法中的sender参数设置为"Hi world",那么prepareSegue方法中的sender参数是否也是相同的字符串?

谢谢

Pau*_*w11 22

实际上,有两种方法可以触发segue.第一种是通过Interface Builder中的UI元素执行操作,第二种是performSegueWithIdentifier:sender:在代码中使用.我说'有效',因为在幕后,当从故事板加载场景时,配置一个最终调用的动作处理程序performSegueWithIdentifier:sender:

performSegueWithIdentifier:sender:被调用时,SEGUE对象被传递到您的视图控制器的prepareForSegue:sender:功能.

在通过对UI元素的动作启动segue的情况下,发送者将是该UI元素(即,如果它是动作连接,UIButton那么sender将是UIButton实例).

如果segue是由您的代码调用启动的performSegueWithIdentifier:sender:那么sender将是您传递的任何对象sender.这可能是你的视图控制器,按钮,数组,任何东西.所以,是的,如果你传递的"Hello World",以performSegueWithIdentifier:sender:作为sender值,那么这将是senderprepareForSegue:sender:

在操作顺序方面:

  1. performSegueWithIdentifier:sender 由您的代码或UI元素上的操作调用
  2. 如果您的视图控制器实现,shouldPerformSegueWithIdentifier:sender:则调用此函数.如果此函数返回,false则取消segue
  3. 创建segue对象和目标视图控制器对象
  4. 如果您的视图控制器实现,prepareForSegue:sender:则调用此函数.
  5. 一旦prepareForSegue:sender:返回,segue就完成了.


The*_*Man 21

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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这有帮助,请告诉我!


Zio*_*rez 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
    }
}
Run Code Online (Sandbox Code Playgroud)