我在Swift 3中使用Objective-C编写了一个...
"author": "Author",
"dependencies" : {
"mysql": "2.12.0",
},
"license": "ISC"
...
子类。
当我尝试添加目标时,它失败并显示错误代码:
npm install
答案 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)
答案 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//)
}