如何在Swift中设置UIBarButtonItem的操作

时间:2014-07-08 20:46:09

标签: ios swift action uibarbuttonitem

如何设置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")

5 个答案:

答案 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)

Swift 5和iOS 13+编程示例

  1. 您必须用@objc标记功能,请参见以下示例!
  2. 函数名称后没有括号!只需使用#selector(name)
  3. privatepublic无关紧要;您可以使用私有。

代码示例

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()
}