2017-04-08 119 views
1

我试图通过UIBarButtonItem作为参数, 但我得到以下错误:如何传递参数给法“#selector”

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

谢谢

+3

请看看“相关”部分,这已经被反复询问和回答。你*不能*在选择器中传递参数。 –

+1

仅供参考 - 该按钮将是参数。你不需要自己指定它。 – rmaddy

+0

@MartinR谢谢,是否有其他解决方案? –

回答

2

永远不会有将参数传递给您在使用时所指的方法文字。参数将由选择器的执行者传递给方法,在这种情况下,这是UIBarButtonItem的内部工作方式。

为了解决这个问题,只需删除参数列表:

#selector(barClicked) 

当进行选择时,sender参数将最有可能保持在工具栏上的第二UIBarButtonItem一个参考,因为你设置选择action作为第二个UIBarButtonItem

但是,t似乎是你故意希望发件人成为工具栏的第一个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)