2015-08-17 2 views
6

Я пытаюсь понять, как значение отправителя работает в segues.swift performSegueWithIdentifier значение отправителя

В некоторых местах в моем коде оба произведения:

performSegueWithIdentifier("mySegue", sender: self) 

performSegueWithIdentifier("mySegue", sender: sender) 

Но в чем разница между наличием собственного/отправителя?

ответ

12

Как сказал @ iosDev82 в своем ответе, отправитель является необязательным, который называет объект (если есть), который вызвал segue.

Если вы вызываете код через код в контроллере вида, вы можете передать контроллер вида (self), или вы можете передать ноль. Это просто часть информации, которая передается вместе для подготовкиForSegue (опять же, как говорится в iOSDv82).

Если вы вызываете segue в коде метода IBAction, ваш IBAction может иметь собственный параметр отправителя (часто кнопка). В этом случае вы можете передать по параметру отправителя метод performSegueWithIdentifier.

Пример:

@IBAction func buttonAction(sender: UIButton) 
{ 
    //In this case the button IBAction takes a pointer to the button as a param. 
    //Pass it on to the segue in case performWithSegue needs it. 
    self.performSegueWithIdentifier("someID", sender: sender) 
} 
+0

Но это также кнопка, и она работает, в чем разница: @IBAction функ MyButton (отправитель: AnyObject) {selfperformSegueWithIdentifier ("someID" , отправитель: self)} Я пытаюсь найти его в документах, не могу найти его:/ –

+1

Параметр отправителя - это то, что вы хотите. Если вам нужно знать, на какую кнопку нажата кнопка для запуска сеанса, пропустите кнопку (отправитель), чтобы выполнить 'performSegueWithIdentifier'. Если вам нужно знать контроллер представления, передайте это. Если вам все равно, пропустите ноль. Информация для вас и будет передана вашему методу 'prepareForSegue'. –

+0

Кроме того, вы * можете * даже пропустить, скажем, словарь с ключами и значениями, которые вам нужно установить на контроллере представления назначения ... – nhgrif

2

sender - это просто аргумент, который передается вместе с этой функцией.

Это получено позже в функции prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!), где вы можете получить этот объект и принять решение на основании того, кто является отправителем.

0

В качестве примера, предположим, что вы хотите изменить что-то в качестве IndexPath. Вы называете

performSegue(withIdentifier: "showItem", sender: indexPath)

от куда вы хотите (indexPath имеет тип IndexPath здесь).

Затем внутри prepare(segue:sender:), вы делаете:

... 
switch segue.identifier { 
case "showItem"?: 
    // Figure out which row was just tapped 
    if let row = tableView.indexPathForSelectedRow?.row { 
     editRow(segue, row) 
    } else { 
     let selectedIndexPath = sender as! IndexPath 
     editRow(segue, selectedIndexPath.row) 
    } 
... 
Смежные вопросы