Как можно настроить действие для настраиваемого 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")
ios
swift
action
uibarbuttonitem
kmiklas
источник
источник
action: "sayHello"
UIBarButtonItem
а в другом - нет. Требовать от новичков обобщения всех вариантов использованияselector
может быть для них трудным, поэтому я удаляю повторяющийся статус, чтобы люди могли обновлять этот вопрос.Ответы:
Начиная с 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
источник
Selector("sayHello")
Swift за кулисы.Пример Swift 4/5
button.target = self button.action = #selector(buttonClicked(sender:)) @objc func buttonClicked(sender: UIBarButtonItem) { }
источник
@objc
в объявление функции. Вплоть до Swift 4 это предполагалось неявно.button.target = self
Пример алгоритмической продажи Swift 5 и iOS 13+
@objc
, см. Пример ниже!#selector(name)
.private
илиpublic
не имеет значения; вы можете использовать приват.Пример кода
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let menuButtonImage = UIImage(systemName: "flame") let menuButton = UIBarButtonItem(image: menuButtonImage, style: .plain, target: self, action: #selector(didTapMenuButton)) navigationItem.rightBarButtonItem = menuButton } @objc public func didTapMenuButton() { print("Hello World") }
источник
Пусть это поможет еще немного
Предположим, что если вы хотите сделать кнопку панели в отдельном файле (для модульного подхода) и хотите вернуть селектор обратно своему контроллеру представления, вы можете сделать следующее: -
ваш служебный файл
class GeneralUtility { class func customeNavigationBar(viewController: UIViewController,title:String){ let add = UIBarButtonItem(title: "Play", style: .plain, target: viewController, action: #selector(SuperViewController.buttonClicked(sender:))); viewController.navigationController?.navigationBar.topItem?.rightBarButtonItems = [add]; } }
Затем создайте класс SuperviewController и определите в нем ту же функцию.
class SuperViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @objc func buttonClicked(sender: UIBarButtonItem) { } }
и в нашем базовом viewController (который наследует ваш класс SuperviewController) переопределить ту же функцию
import UIKit class HomeViewController: SuperViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func viewWillAppear(_ animated: Bool) { GeneralUtility.customeNavigationBar(viewController: self,title:"Event"); } @objc override func buttonClicked(sender: UIBarButtonItem) { print("button clicked") } }
Теперь просто унаследуйте SuperViewController от того класса, который вам нужен.
Спасибо за прочитанное
источник
Swift 5
если вы создали
UIBarButtonItem
в Интерфейсном Разработчике и подключили розетку к элементу и хотите привязать селектор программно.Не забудьте установить цель и селектор.
addAppointmentButton.action = #selector(moveToAddAppointment) addAppointmentButton.target = self @objc private func moveToAddAppointment() { self.presenter.goToCreateNewAppointment() }
источник