Как установить действие для 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")
Ответы
Ответ 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")
}