2015-06-07 3 views
2

У меня есть простой Написать код здесьSwift Selector с аргументом по умолчанию

self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: Selector("cancelClick")) 

Реальная функция

func cancelClick(isAlert:String = "yes"){ 
    self.dismissViewControllerAnimated(true, completion: {() -> Void in 

     if isAlert == "yes" { 
      Functions.displayAlert("called") 
     } 
    }) 
} 
  1. self.cancelClick() - работал, но если я не прошел аргумент
  2. self.cancelClick(isAlert:"no") - Разбился

Итак, какой должен быть мой селектор, если мне нужно передать аргумент в по умолчанию по умолчанию попробовал как с Selector("cancelClick"), так и с Selector("cancelClick:"), но не повезло.

+0

«Разбитый»? С какой ошибкой? – ABakerSmith

+0

@ ABakerSmith непризнанный селектор отправлен «cancelClick» –

ответ

2

Дело в том, что параметр не до вас. Это всегда кнопка («отправитель»), и это только вещь это может быть.

Другими словами, если вы хотите, чтобы эта функция имела параметр, то вам обязательно нужно будет установить селекторную строку как "cancelClick:" - двоеточие означает, что он принимает параметр. Но этот параметр должен быть кнопка:

func cancelClick(bbi:UIBarButtonItem?) { 

Однако, вы заметите, что я ловко сделал это UIBarButtonItem параметр Факультативный. Почему вы думаете, что я это сделал? Потому что теперь вы можете также называть его непосредственно и передать ноль:

self.cancelClick(nil) 

Таким образом, cancelClick: теперь есть способ узнать, идет ли вызов от постукивания кнопки или путем прямого вызова - если bbi не ноль, кнопка была нажата; если bbiis nil, мы были вызваны непосредственно из кода. Скрытность, а?

Другого подлый подход, чтобы сделать параметр в AnyObject:

func cancelClick(sender:AnyObject) { 

Красота этого является то, что вы можете назвать это с любого рода экземпляр класса. cancelClick может проверить тип sender. Если это UIBarButtonItem (sender is UIBarButtonItem), мы вызывались, нажимая кнопку. В противном случае, если вы вызываете код, вы можете передать строку или что-нибудь еще, с чем эта функция может быть подготовлена.

+0

да, я получил вашу точку благодарения, я не думал об этом от цели Objective-C, поскольку первым аргументом был бы отправитель так мы не можем этого изменить. –

+0

Правильно, но это не «Objective-C», которое делает это правило; это какао. Но у вас есть идея, да. Целевое действие _mechanism_ предопределено; это часть того, как строится Какао. – matt

+0

да, вы правы :) –

0

Не используйте Selector("cancelClick:"), попробуйте вместо этого просто "cancelClick:" с двоеточием, чтобы вы могли передать аргумент.

И как сказал Мэтт, аргумент, который вы должны передать, - это sender (кнопка).

+0

да, но спасибо за то, что вы действительно на самом деле я пропустил из-за аргумента по умолчанию –

Смежные вопросы