如何在 Swift 中为 UIBarButtonItem 设置动作

Posted

技术标签:

【中文标题】如何在 Swift 中为 UIBarButtonItem 设置动作【英文标题】:How to set the action for a UIBarButtonItem in Swift 【发布时间】:2014-08-29 18:01:33 【问题描述】:

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

【问题讨论】:

您只需将选择器放入字符串action: "sayHello" 即可快速传递选择器 非常感谢。我迫于压力要解决这个问题并且感到沮丧。 此问题之前被标记为与@selector() in Swift? 重复。但是,这个问题专门询问 UIBarButtonItem 而另一个没有。要求初学者概括 selector 的所有用法对他们来说可能很困难,所以我删除了重复状态,以便人们可以及时更新这个问题。 【参考方案1】:

Swift 4/5 示例

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

@objc func buttonClicked(sender: UIBarButtonItem) 
        

【讨论】:

这是对的,对于 Swift 4 你需要在函数声明中添加@objc。在 Swift 4 之前,这是隐式推断的。 button.target = self @Mahesh 不需要设置目标 @norbDEV 目标需要 Swift 5【参考方案2】:

Swift 5 和 ios 13+ 编程示例

    你必须用@objc标记你的函数,见下面的例子! 函数名后面没有括号!只需使用#selector(name)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】:

斯威夫特 5

如果您在 Interface Builder 中创建了 UIBarButtonItem 并且您将出口连接到项目并希望以编程方式绑定选择器。

别忘了设置目标和选择器。

addAppointmentButton.action = #selector(moveToAddAppointment)
addAppointmentButton.target = self

@objc private func moveToAddAppointment() 
     self.presenter.goToCreateNewAppointment()

【讨论】:

【参考方案4】:

希望这篇文章能多一点帮助

假设如果您想在单独的文件中制作条形按钮(用于模块化方法)并希望将选择器返回给您的视图控制器,您可以这样做:-

您的实用程序文件

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。

感谢阅读

【讨论】:

【参考方案5】:

从 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

【讨论】:

只是说action函数不能是private!我不太清楚为什么,但如果我提供了一些私有函数的名称,我总是会收到错误 我得到了这个:“没有实现 methodSignatureForSelector” @AlamoPS 如果您使用带有冒号的第二个版本,您需要确保函数参数类型与您正在处理的任何操作相匹配。 @RyanForsyth 无论如何,字符串实际上在幕后被 Swift 翻译成 Selector("sayHello") 这个答案已经过时了。

以上是关于如何在 Swift 中为 UIBarButtonItem 设置动作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中为以下观察删除 GeoFire 句柄?

如何在 Swift 中为 UIBarButtonItem 设置动作

如何在 Swift 中为 UIImage 着色?

如何在 Swift 中为 NSLayoutConstraint 设置动画?

如何在 swift 中为 iOS 全局添加 HTTP 标头

如何在 Swift 中为 NSObject 模型变量添加值?