查找UIGestureRecognizer操作(select器)名称和目标

我试图find哪个动作是由UIGestureRecognizer触发的目标。 不幸的是,在UIGestureRecognizer上没有属性,比如gesture.action或者gesture.target 。 我正在分析的姿态是UIKit私有实现的一部分。

部分答案在这里

stackOverFlow问题20066315

这是一个代码片段,它将列出与手势识别器关联的所有目标/动作对:

 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)); } 

请注意,您必须导入<objc/runtime.h> ,并使用私有ivars和一个类,所以它可能让你从App Store中被禁止。

我有一个不同的解决scheme,这已经为我工作。 这更多的是devise更改…你不能从捕获的手势访问目标。 因此,在发生触碰事件发生时以及在平底锅开始之前,请保留对该对象的引用。

 @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; }