如何设置Swift中自定义UIBarButtonItem的操作?
以下代码成功地将按钮放在导航栏中:
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()
出现在智能感知中,但不起作用。
感谢您的帮助。
编辑:对于子孙后代,以下作品:
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:"sayHello")
答案 0 :(得分:139)
从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
答案 1 :(得分:20)
Swift 4示例
button.action = #selector(buttonClicked(sender:))
@objc func buttonClicked(sender: UIBarButtonItem) {
}
答案 2 :(得分:2)
@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")
}
答案 3 :(得分:0)
这可能对您有所帮助
假设您想将bar按钮制作在一个单独的文件中(用于模块化方法),并希望将选择器还给您的viewcontroller,您可以这样做:-
您的实用程序文件
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")
}
}
现在,只需在想要此barbutton的任何类中继承SuperViewController。
感谢阅读
答案 4 :(得分:0)
快捷键5
如果您已在Interface Builder中创建了UIBarButtonItem
,并且将插座连接到项目并希望以编程方式绑定选择器。
不要忘记设置目标和选择器。
addAppointmentButton.action = #selector(moveToAddAppointment)
addAppointmentButton.target = self
@objc private func moveToAddAppointment() {
self.presenter.goToCreateNewAppointment()
}