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

MJQ*_*347 34 cocoa-touch objective-c ios swift

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

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

mat*_*att 41

问题在于#selector(self.action()),self.action()是一个方法调用.你不想调用这个方法; 你想命名方法.#selector(action)相反说:丢失括号,再加上没有必要self.

  • 如果函数有多个参数怎么办? (2认同)

cjr*_*eck 29

您所要做的就是将func标记为,@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

    }
}
Run Code Online (Sandbox Code Playgroud)

private如果你愿意,你甚至可以制作它


Vic*_*ohn 9

@objc在前面添加关键字是完美的方法,但我仍然出现此错误。最后,我找到了解决方案如下 在此处输入图片说明

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

  • 这是我遇到的答案,可能有人也遇到过。我通过删除括号解决了它。你为什么不赞成我的回答?这是真正的答案!@paper1111 (2认同)