it-swarm.com.ru

prepareForSegue и PerformSegueWithIdentifier отправитель

Мне интересно, как работают функции в заголовке, а также о параметре отправителя. 

Допустим, нажатие кнопки вызывает метод executeSegue, это также вызывает метод prepareSegue? Вызывается ли метод prepareSegue перед методом executeSegue, но после нажатия кнопки?

Кроме того, параметр "отправитель" в обеих функциях связан? Если я передам строку в качестве отправителя в методе executeSegue, будет ли это передано параметру отправителя в методе prepareSegue? Другими словами, если я установлю параметр отправителя в методе executeSegue как «Привет мир», будет ли параметр отправителя в методе prepareSegue такой же строкой? 

Спасибо

5
JasonP

По сути, есть два способа вызвать приступ. Первый - действие через элемент пользовательского интерфейса в Интерфейсном Разработчике, второй - использование performSegueWithIdentifier:sender: в вашем коде. Я говорю «эффективно», потому что под прикрытием, когда сцена загружается из раскадровки, настраивается обработчик действий, который в конечном итоге вызывает performSegueWithIdentifier:sender:

Когда вызывается performSegueWithIdentifier:sender:, объект segue доставляется в функцию prepareForSegue:sender: контроллера вашего представления.

В случае, когда переход был инициирован действием над элементом UI, отправителем будет этот элемент UI (т. Е. Если это соединение действия с UIButton, тогда sender будет экземпляром UIButton).

Если передача инициируется вашим кодом, вызывающим performSegueWithIdentifier:sender:, тогда sender будет тем объектом, который вы передали как sender. Это может быть ваш контроллер представления, кнопка, массив, что угодно. Так что да, если вы передадите «Hello World» performSegueWithIdentifier:sender: в качестве значения sender, тогда это будет sender в prepareForSegue:sender:

С точки зрения порядка операций:

  1. performSegueWithIdentifier:sender вызывается либо вашим кодом, либо в результате действия над элементом пользовательского интерфейса
  2. Если ваш контроллер представления реализует shouldPerformSegueWithIdentifier:sender:, то эта функция вызывается. Если эта функция возвращает false, тогда переход отменяется
  3. Объект segue и объект контроллера представления назначения созданы
  4. Если ваш контроллер представления реализует prepareForSegue:sender:, то эта функция вызывается.
  5. Как только prepareForSegue:sender: возвращается, переход завершается.
21
Paulw11

Метод executeSegue вызывает переход, который должен выполняться из одного представления в другое. Перед тем, как на самом деле происходит segue, вызывается метод prepareForSegue, и если вы хотите передать данные между представлениями, вы сделаете это там. 

Метод executeSegue не принимает параметр, который вы хотите отправить. Он используется только для вызова 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
    }
}

Позвольте мне знать, если это помогает!

20
The_Curry_Man

Ответ 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
    }
}
5
Zion Perez

мои два цента для начинающих ... в 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(...)
    }

}
2
ingconti