Подтвердить что ты не робот

Как установить действие для UIBarButtonItem в Swift

Как можно настроить действие для пользовательского UIBarButtonItem в Swift?

Следующий код успешно помещает кнопку в навигационную панель:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:nil)
self.navigationItem.rightBarButtonItem = b

Теперь, я хочу называть func sayHello() { println("Hello") } при нажатии кнопки. Мои усилия до сих пор:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:sayHello:)
// also with `sayHello` `sayHello()`, and `sayHello():`

и..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(sayHello:))
// also with `sayHello` `sayHello()`, and `sayHello():`

и..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(self.sayHello:))
// also with `self.sayHello` `self.sayHello()`, and `self.sayHello():`

Обратите внимание, что sayHello() появляется в intellisense, но не работает.

Спасибо за вашу помощь.

EDIT: для потомков следующие работы:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:"sayHello")
4b9b3361

Ответ 1

Начиная с Swift 2.2 существует специальный синтаксис для селекторов, прошедших проверку компилятора. Он использует синтаксис: #selector(methodName).

Swift 3 и более поздние версии:

var b = UIBarButtonItem(
    title: "Continue",
    style: .plain,
    target: self,
    action: #selector(sayHello(sender:))
)

func sayHello(sender: UIBarButtonItem) {
}

Если вы не знаете, как должно выглядеть имя метода, есть специальная версия команды копирования, которая очень полезна. Поместите курсор где-нибудь в имени базового метода (например, sayHello) и нажмите Shift + Control + Option + C. Это добавляет "Символьное имя на клавиатуре". Если вы также удерживаете Command, он скопирует "Квалифицированное имя символа", которое также будет содержать этот тип.

Swift 2.3:

var b = UIBarButtonItem(
    title: "Continue",
    style: .Plain,
    target: self,
    action: #selector(sayHello(_:))
)

func sayHello(sender: UIBarButtonItem) {
}

Это связано с тем, что первое имя параметра не требуется в Swift 2.3 при вызове метода.

Подробнее о синтаксисе на сайте swift.org вы можете узнать здесь: https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors

Ответ 2

Пример Swift 4

button.action = #selector(buttonClicked(sender:))

@objc func buttonClicked(sender: UIBarButtonItem) {

}

Ответ 3

В Swift 4 нам нужно добавить @objc до действия метода.

См. Следующий пример:

self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Select", target: self, action: #selector(selectAction(_:)))

 @objc func selectAction(_ sender:UIBarButtonItem) -> Void {
    print("Select Clicked")
}