如何在Swift中设置UIBarButtonItem的操作

kmi*_*las 78 action uibarbuttonitem ios swift

如何设置Swift中自定义UIBarButtonItem的操作?

以下代码成功将按钮放在导航栏中:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:nil)
self.navigationItem.rightBarButtonItem = b
Run Code Online (Sandbox Code Playgroud)

现在,我想func sayHello() { println("Hello") }在触摸按钮时打电话.到目前为止我的努力:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:sayHello:)
// also with `sayHello` `sayHello()`, and `sayHello():`
Run Code Online (Sandbox Code Playgroud)

和..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(sayHello:))
// also with `sayHello` `sayHello()`, and `sayHello():`
Run Code Online (Sandbox Code Playgroud)

和..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(self.sayHello:))
// also with `self.sayHello` `self.sayHello()`, and `self.sayHello():`
Run Code Online (Sandbox Code Playgroud)

请注意,它sayHello()出现在intellisense中,但不起作用.

谢谢你的帮助.

编辑:对于后代,以下工作:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:"sayHello")
Run Code Online (Sandbox Code Playgroud)

dre*_*wag 147

从Swift 2.2开始,编译器时间检查选择器有一种特殊的语法.它使用语法:#selector(methodName).

Swift 3及更高版本:

var b = UIBarButtonItem(
    title: "Continue",
    style: .plain,
    target: self,
    action: #selector(sayHello(sender:))
)

func sayHello(sender: UIBarButtonItem) {
}
Run Code Online (Sandbox Code Playgroud)

如果您不确定方法名称应该是什么样的,那么复制命令的特殊版本非常有用.将光标放在基本方法名称中(例如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) {
}
Run Code Online (Sandbox Code Playgroud)

这是因为在进行方法调用时,Swift 2.3中不需要第一个参数名称.

您可以在此处了解有关swift.org语法的更多信息:https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors

  • 只是提到动作功能不能**私人**!我不确定为什么,但我总是得到一个错误,以防我提供一些私人功能的名称 (10认同)
  • 这个答案已经过时了。 (2认同)

nor*_*DEV 26

Swift 4的例子

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

@objc func buttonClicked(sender: UIBarButtonItem) {

}
Run Code Online (Sandbox Code Playgroud)

  • 没错,对于Swift 4,您需要在函数声明中添加`@ objc`。直到Swift 4才隐式推断出这一点。 (4认同)

Zor*_*ayr 6

Swift 5 和 iOS 13+ 编程示例

  1. 您必须用以下标记您的功能@objc,请参阅下面的示例!
  2. 函数名后面没有括号!只需使用#selector(name).
  3. 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")
}
Run Code Online (Sandbox Code Playgroud)