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

时间:2017-01-06 18:26:42

标签: ios objective-c swift cocoa-touch

我在Swift 3中使用Objective-C编写了一个... "author": "Author", "dependencies" : { "mysql": "2.12.0", }, "license": "ISC" ... 子类。

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

npm install

6 个答案:

答案 0 :(得分:35)

问题在于#selector(self.action())self.action()方法调用。你不想调用方法;你想要命名方法。请说#selector(action):丢失括号,而且不需要self

答案 1 :(得分:26)

您所要做的就是将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

    }
}

如果你想要

,你甚至可以private

答案 2 :(得分:4)

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

如上图所示,该方法背后有一对多余的括号。我应该做的是删除它并且效果很好。

答案 3 :(得分:2)

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

试试这个:

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

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

的SuperView:

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()"超级视图的方法?双重的:

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

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