如何使用'#selector'将Argument传递给方法

时间:2017-04-08 16:54:17

标签: swift selector uibarbuttonitem

我正在尝试传递UIBarButtonItem作为参数, 但我收到以下错误:

  

'#selector'的参数不是指'@objc'方法,属性,   或初始化程序

@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

由于

1 个答案:

答案 0 :(得分:3)

在使用#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)