带有参数 gestureRecognizer 的选择器
selector with argument gestureRecognizer
Argument of '#selector' does not refer to an '@objc' method, property,
or initializer
问题:当我尝试使用选择器传递参数时出现以上错误
代码片段:
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(labelPressed(i: 1)))
func labelPressed(i: Int){
print(i)
}
你应该像这样声明函数:
@objc func labelPressed(i: Int){ print(i) }
Swift3 的更新:
使用更现代的语法,您可以这样声明您的函数:
@objc func labelTicked(withSender sender: AnyObject) {
并像这样初始化你的手势识别器,使用#selector:
UITapGestureRecognizer(target: self, action: #selector(labelTicked(withSender:)))
您不能将参数传递给这样的函数。动作 - 这是只传递发送者,在这种情况下是手势识别器。您想要做的是获取您将手势附加到的 UIView
:
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(labelPressed())
func labelPressed(_ recognizer:UITapGestureRecognizer){
let viewTapped = recognizer.view
}
更多注意事项:
(1) You may only attach a single view to a recognizer.
(2) You might want to use both the `tag` property along with the `hitTest()` method to know which subview was hit. For example:
let view1 = UIView()
let view2 = UIView()
// add code to place things, probably using auto layout
view1.tag = 1
view2.tag = 2
mainView.addSubview(view1)
mainView.addSubview(view2)
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(mainViewTapped())
func mainViewTapped(_ recognizer:UITapGestureRecognizer){
// get the CGPoint of the tap
let p = recognizer.location(in: self)
let viewTapped:UIView!
// there are many (better) ways to do this, but this works
for view in self.subviews as [UIView] {
if view.layer.hitTest(p) != nil {
viewTapped = view
}
}
// if viewTapped != nil, you have your subview
}
Argument of '#selector' does not refer to an '@objc' method, property, or initializer
问题:当我尝试使用选择器传递参数时出现以上错误 代码片段:
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(labelPressed(i: 1)))
func labelPressed(i: Int){
print(i)
}
你应该像这样声明函数:
@objc func labelPressed(i: Int){ print(i) }
Swift3 的更新:
使用更现代的语法,您可以这样声明您的函数:
@objc func labelTicked(withSender sender: AnyObject) {
并像这样初始化你的手势识别器,使用#selector:
UITapGestureRecognizer(target: self, action: #selector(labelTicked(withSender:)))
您不能将参数传递给这样的函数。动作 - 这是只传递发送者,在这种情况下是手势识别器。您想要做的是获取您将手势附加到的 UIView
:
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(labelPressed())
func labelPressed(_ recognizer:UITapGestureRecognizer){
let viewTapped = recognizer.view
}
更多注意事项:
(1) You may only attach a single view to a recognizer.
(2) You might want to use both the `tag` property along with the `hitTest()` method to know which subview was hit. For example:
let view1 = UIView()
let view2 = UIView()
// add code to place things, probably using auto layout
view1.tag = 1
view2.tag = 2
mainView.addSubview(view1)
mainView.addSubview(view2)
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(mainViewTapped())
func mainViewTapped(_ recognizer:UITapGestureRecognizer){
// get the CGPoint of the tap
let p = recognizer.location(in: self)
let viewTapped:UIView!
// there are many (better) ways to do this, but this works
for view in self.subviews as [UIView] {
if view.layer.hitTest(p) != nil {
viewTapped = view
}
}
// if viewTapped != nil, you have your subview
}