简体   繁体   中英

Find UIGestureRecognizer action (selector) name and target

I'm trying to find which action is triggered by a UIGestureRecognizer on which target. Unfortunately there is no property on a UIGestureRecognizer such as gesture.action or gesture.target . The gesture I'm analyzing is part of UIKit private implementation.

Partial Answer here

stackOverFlow Question 20066315

Here's a code snippet that will list all target/action pairs associated with a gesture recognizer:

Ivar targetsIvar = class_getInstanceVariable([UIGestureRecognizer class], "_targets");
id targetActionPairs = object_getIvar(gesture, targetsIvar);

Class targetActionPairClass = NSClassFromString(@"UIGestureRecognizerTarget");
Ivar targetIvar = class_getInstanceVariable(targetActionPairClass, "_target");
Ivar actionIvar = class_getInstanceVariable(targetActionPairClass, "_action");

for (id targetActionPair in targetActionPairs)
{
    id target = object_getIvar(targetActionPair, targetIvar);
    SEL action = (__bridge void *)object_getIvar(targetActionPair, actionIvar);

    NSLog(@"target=%@; action=%@", target, NSStringFromSelector(action));
}

Note that you'll have to import <objc/runtime.h> , and that this uses private ivars and a class, so it could get you banned from the App Store.

I have a different solution to this which has worked for me. This is more of a design change... you cannot access the target from the captured gesture. So instead keep a reference to the object when the touch down happened and before the pan began.

@property (nonatomic, strong) UIButton *myTouchedButton; // reference to button

(void)init
{
    ...
    [card.button addTarget:self action:@selector(cardTouchDownInside:) forControlEvents:UIControlEventTouchDown];
    ...
}

-(void)cardTouchDownInside:(id)sender
{
    NSLog(@"touch down on object");
    self.myTouchedButton = (UIButton*)sender;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM