5

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

Community
  • 1
  • 1
Nicolas Manzini
  • 8,379
  • 6
  • 63
  • 81

2 Answers2

6

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.

Austin
  • 5,625
  • 1
  • 29
  • 43
  • Would it be possible to capture the value of navigationController.interactivePopGestureRecognizer._targets using KVC and apply it to a pan gesture recogniser? – Kugutsumen Aug 14 '19 at 01:04
0

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;
}
mihai
  • 4,184
  • 3
  • 26
  • 27