Как установить действие для 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, но не работает.

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

изменить: Для потомков созданы следующие произведения:

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

2 ответа:

начиная с 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+управления+опции+C. Это ставит "имя символа" на клавиатуре для вставки. Если вы также держите команда он скопирует "квалифицированное имя символа", которое также будет включать тип.

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

Swift 4 пример

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

@objc func buttonClicked(sender: UIBarButtonItem) {

}