如何使用“#selector”将参数传递给方法
How to pass Argument to method with '#selector'
我正在尝试将 UIBarButtonItem
作为参数传递,
但我收到以下错误:
Argument of '#selector' does not refer to an '@objc' method, property,
or initializer
@objc func barClicked( sender: AnyObject) {
}
override func viewDidLoad() {
super.viewDidLoad()
let bar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 50))
bar.barStyle = UIBarStyle.default
bar.items = [
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(barClicked(sender: bar.items[0])))]
bar.sizeToFit()
}
也尝试过#selector(barClicked(sender: bar.items[0] as AnyObject
谢谢
在使用 #selector
文字时,您永远不会 曾经 将参数传递给您所指的方法。参数将由选择器的执行者传递给方法,在本例中,它是 UIBarButtonItem
.
的内部工作原理
要解决这个问题,只需删除参数列表:
#selector(barClicked)
执行选择器时,sender
参数很可能会引用工具栏中的第二个 UIBarButtonItem
,因为您将选择器设置为 action
第二个 UIBarButtonItem
.
但是,您似乎故意希望发件人成为工具栏的第一个 UIBarButtonItem
。这听起来很违反直觉。你可能在这里做错了什么。但是如果你坚持要通过工具栏的第一项,那么这样做:
// add a new method like this:
func someMethod() { // name this properly!
barClicked(sender: bar.items[0]) // please make bar a class-level variable first.
}
那你可以参考someMethod
和#selector
:
#selector(someMethod)
我正在尝试将 UIBarButtonItem
作为参数传递,
但我收到以下错误:
Argument of '#selector' does not refer to an '@objc' method, property, or initializer
@objc func barClicked( sender: AnyObject) {
}
override func viewDidLoad() {
super.viewDidLoad()
let bar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 50))
bar.barStyle = UIBarStyle.default
bar.items = [
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(barClicked(sender: bar.items[0])))]
bar.sizeToFit()
}
也尝试过#selector(barClicked(sender: bar.items[0] as AnyObject
谢谢
在使用 #selector
文字时,您永远不会 曾经 将参数传递给您所指的方法。参数将由选择器的执行者传递给方法,在本例中,它是 UIBarButtonItem
.
要解决这个问题,只需删除参数列表:
#selector(barClicked)
执行选择器时,sender
参数很可能会引用工具栏中的第二个 UIBarButtonItem
,因为您将选择器设置为 action
第二个 UIBarButtonItem
.
但是,您似乎故意希望发件人成为工具栏的第一个 UIBarButtonItem
。这听起来很违反直觉。你可能在这里做错了什么。但是如果你坚持要通过工具栏的第一项,那么这样做:
// add a new method like this:
func someMethod() { // name this properly!
barClicked(sender: bar.items[0]) // please make bar a class-level variable first.
}
那你可以参考someMethod
和#selector
:
#selector(someMethod)