【问题标题】:Find UIGestureRecognizer action (selector) name and target查找 UIGestureRecognizer 操作(选择器)名称和目标
【发布时间】:2013-12-02 16:43:34
【问题描述】:

我试图找出哪个动作是由哪个目标上的 UIGestureRecognizer 触发的。不幸的是,UIGestureRecognizer 上没有属性,例如 gesture.actiongesture.target。我正在分析的手势是 UIKit 私有实现的一部分。

这里是部分答案

stackOverFlow Question 20066315

【问题讨论】:

    标签: ios iphone ipad uikit


    【解决方案1】:

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

    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 禁止。

    【讨论】:

    • 是否可以使用 KVC 捕获 navigationController.interactivePopGestureRecognizer._targets 的值并将其应用于平移手势识别器?
    【解决方案2】:

    对此我有一个不同的解决方案,它对我有用。这更像是一种设计更改...您无法从捕获的手势访问目标。因此,请在触地发生时和平移开始之前保留对对象的引用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 2020-02-14
      • 2021-01-11
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2016-12-19
      相关资源
      最近更新 更多