prepareForSegue和PerformSegueWithIdentifier发件人

时间:2016-06-14 23:04:41

标签: ios objective-c iphone xcode swift

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

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

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

由于

6 个答案:

答案 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:

就操作顺序而言:

  1. performSegueWithIdentifier:sender由您的代码或UI元素上的操作调用
  2. 如果视图控制器实现shouldPerformSegueWithIdentifier:sender:,则调用此函数。如果此函数返回false,则取消segue
  3. 创建segue对象和目标视图控制器对象
  4. 如果视图控制器实现prepareForSegue:sender:,则调用此函数。
  5. 一旦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
    }
}