【问题标题】:How to pass Argument to method with '#selector'如何使用“#selector”将参数传递给方法
【发布时间】:2017-04-08 16:54:17
【问题描述】:

我正在尝试将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

谢谢

【问题讨论】:

  • 请查看“相关”部分,这已被反复询问和回答。您不能在选择器中传递参数。
  • 仅供参考 - 按钮将作为参数。您无需自己指定。
  • @MartinR 谢谢,有没有办法解决这个问题?
  • 您是否阅读了“相关”问题及其答案?
  • 您应该阅读UIControl 的文档和“目标-动作机制”部分。它也适用于UIBarButtonItem

标签: swift selector uibarbuttonitem


【解决方案1】:

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

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

#selector(barClicked)

执行选择器时,sender 参数很可能会引用工具栏中的第二个UIBarButtonItem,因为您将选择器设置为第二个UIBarButtonItemaction

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2016-10-25
    • 2010-10-30
    • 2014-04-20
    • 1970-01-01
    相关资源
    最近更新 更多