【问题标题】:Sending arguments to gesture recognizer initialization selector?向手势识别器初始化选择器发送参数?
【发布时间】:2012-05-19 22:43:18
【问题描述】:
在我的程序中,我有一个UITapGestureRecognizer,我已经用initWithTarget: action: 对其进行了初始化。我传入了一个选择器来调用名为PlanetTapped: (UIImageView *)aPlanet 的方法。这很好地调用了该方法,但是我想知道如何将参数传递给action:,就像使用performSelector: withObject 一样。这是可能的吗?允许您向UIGestureRecognizer 的选择器发送参数是有意义的。任何帮助表示赞赏。
【问题讨论】:
标签:
objective-c
ios
methods
selector
uitapgesturerecognizer
【解决方案1】:
要调用的方法的正确签名是:
-(void) PlanetTapped: (UIGestureRecognizer*)gestureRecognizer
然后你可以通过调用来访问接收到手势的视图:
-(void) PlanetTapped: (UIGestureRecognizer*)gestureRecognizer {
UIImageView* aPlanet = gestureRecognizer.view;
...
}
确实,UIGestureRecognizer reference 是这么说的:
手势识别器有一个或多个与之关联的目标-动作对。如果有多个目标-动作对,它们是离散的,而不是累积的。手势的识别导致将动作消息发送到每个对的目标。调用的操作方法必须符合以下签名之一:
- (void)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;
【解决方案2】:
- (void)viewDidLoad
{
UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressOnPhotos:)];
[yourView addGestureRecognizer:longPressRecognizer];
}
- (IBAction)handleLongPressOnPhotos:(UILongPressGestureRecognizer *)sender{
// use "sender.view" to get the "yourView" you have long pressed
}
希望这些对您有所帮助。
【解决方案3】:
在 Swift 3.0 中,函数签名如下(在这些示例中适当替换另一个手势识别器类):
func myButtonLongTouch(_ sender: UILongPressGestureRecognizer)
您在设置手势识别器时引用此函数,如下所示:
longTouchGesture = UILongPressGestureRecognizer(target: self, action: #selector(myButtonLongTouch(_:)))
然后,要访问被按下的视图(在我的例子中是一个按钮),请使用以下代码:
if let button = sender.view as? UIButton {
// Your code here
}
最后,不要忘记这个函数被多次调用(通常是在手势开始和结束时),所以你需要检查状态,你可以这样做:
if (sender.state == UIGestureRecognizerState.ended) {
// Your code here
}