'#selector'的参数不是指'@objc'方法,属性或初始值设定项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了'#selector'的参数不是指'@objc'方法,属性或初始值设定项相关的知识,希望对你有一定的参考价值。

我在Swift 3中提出了一个用Objective-C编写的UIButton子类。

当我尝试添加目标时,它失败并显示错误代码:

class ActionButton: JTImageButton {

    func action() {

    }

    func configure()) {
        // ...
        self.addTarget(self, action: #selector(self.action()), for: .touchUpInside)
        // error: 
        // Argument of '#selector' does not refer to an '@objc' method, property, or initializer

    }
}
答案

您所要做的就是将函数标记为@objc,并且不需要self引用或括号

class ActionButton: JTImageButton {

    @objc func btnAction() {

    }

    func configure() {
        // ...
        self.addTarget(self, action: #selector(btnAction), for: .touchUpInside)
        // error: 
        // Argument of '#selector' does not refer to an '@objc' method, property, or initializer

    }
}

如果你愿意,你甚至可以把它变成private

另一答案

问题是在#selector(self.action())中,self.action()是一种方法调用。你不想调用这个方法;你想命名方法。再说#selector(action):丢失括号,再加上不需要self

另一答案

在前面添加@objc关键字是完美的方法,但我仍然遇到此错误。最后,我发现了解决方案如下enter image description here

如上图所示,该方法背后有一对多余的括号。我应该做的是删除它,它运作良好。

另一答案

从另一个答案的评论中添加:func action()不仅仅是函数名称和操作的糟糕选择,它无法构建。 (你可以使用它作为输入函数参数,为了清楚起见,我将目标/动作传递给设置这些东西的init()。)为了清楚起见,我用MyAction()替换它。


试试这个:

self.addTarget(self, action: #selector(MyAction), for: .touchUpInside)

说,一个更好的设计是将MyAction()函数移动到按钮superview,因为这使得事物更符合基本的MVC设计:

上海华:

let myButton = ActionButton()
// include other button setup here
myButton.addTarget(self, action: #selector(MyAction), for: .touchUpInside

func action(_ sender: ActionButton) {
    // code against button tap here
}

替代编码,在视图控制器中保留“action()”方法,但只将“addTarget”移动到按钮中:

self.addTarget(superview?, action(superview?.MyAction), for: .touchUpInside)

为什么我要求您考虑将“MyAction()”方法移至superview?双重:

  • 它不仅控制按钮,还控制其视图中的所有其他子视图,它们通常通过视图控制器相互交互。
  • 它使按钮在其他场景中更具可重用性。
另一答案

而不是说self.action(),使用ActionButton.action()

另一答案

如果您不介意添加额外的功能,可以嵌套该功能。

self.addTarget(self, action: myAction, for: UIControlledEvent)

myAction(){
    @obj.methodYouWantToCall(//parameters//)
}

以上是关于'#selector'的参数不是指'@objc'方法,属性或初始值设定项的主要内容,如果未能解决你的问题,请参考以下文章

'#selector'的参数不引用Swift按钮目标中的'@objc'方法,属性或初始化程序

scrapy用xpath获取内容后想用 '_root'得到'Selector'的HtmlElement对象,为啥行不通?

jQuery事件处理 事件对象 动画效果

将自定义参数传递给 uibutton #selector swift 3

ios [__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a97d4c0'报错

最近在自学python girlphoto_urls = selector.xpath('//div/a/img/@src')这句是啥意思?大神