【问题标题】:Getting the Action of UIGestureRecognizer in iOS在iOS中获取UIGestureRecognizer的Action
【发布时间】:2013-11-27 11:00:39
【问题描述】:

我在NSLog中的tableView:didSelectRowAtIndexPath方法中打印了一个UITableviewCell的手势

<UIScrollViewPanGestureRecognizer: 0x11e92080; state = Possible; cancelsTouchesInView = NO; delaysTouchesEnded = NO; view = <UITableViewCellScrollView 0x11e94bf0>; target= <(action=handlePan:, target=<UITableViewCellScrollView 0x11e94bf0>)>> 

我已将此 UIScrollViewPanGestureRecognizer 分配给 UIGestureRecognizer 以访问它的属性,如下所示,

 UIGestureRecognizer *myGes=[temp.gestureRecognizers objectAtIndex:1];

我可以访问“myGes”的所有属性

 myGes.state;
 myGes.cancelsTouchesInView;
 myGes.delaysTouchesEnded;
 myGes.view;

除了一个名为target的属性。

是否有可能访问该属性?因为我需要执行那个动作。

任何 cmet 或建议将不胜感激。

提前谢谢你。

【问题讨论】:

  • 我问过同样的问题,但没有结果。见stackoverflow.com/questions/20066315/…
  • @NicolasManzini...OOPS...意思是没有办法?
  • 我还是不知道...
  • @NicolasManzini ..感谢您在该链接中提出的问题并 +1 ..由于我的声誉低下,我无法在该问题下发表评论..如果您发现任何问题,请通知我更好的解决方案。

标签: ios objective-c uitableview uigesturerecognizer


【解决方案1】:

有一种方法可以访问属性target,但我不确定这种方法是否会通过 Apple 的审批流程。

NSMutableArray *targets = [myGes valueForKeyPath:@"_targets"];
id targetContainer = targets[0];//get first target for example
id targetOfMyGes = [targetContainer valueForKeyPath:@"_target"];
NSLog(@"%@", targetOfMyGes );//you can see reference for target object

感谢neilco - 他的回答有助于创建解决方案。

注意:对象targetOfMyGes的具体类需要自己定义。默认为id - 适用于任何对象类。

【讨论】:

  • +1 谢谢..@RuslanSoldatenko..这就像访问私有属性或私有方法?
  • 是的,通过 KVC - Key Value Coding 可以访问私有属性或私有方法。但我不确定苹果鼓励了什么。
  • @Ashok Kumar .S 小补充:数组targets 包含隐藏的类对象UIGestureRecognizerTarget 可以在这里找到描述:github.com/rpetrich/iphoneheaders/blob/master/UIKit/…
  • @RuslanSoldatenko..但在以 id action = [targetContainer valueForKeyPath:@"_action"] 身份访问操作时;应用程序崩溃了。
  • 下划线是不必要的。 KVC 会自动搜索以下划线开头的实例变量,因此@"targets"@"target" 更可取。此外,您可以使用valueforKey: 而不是valueForKeyPath:,因为您只使用一个键,而不是键路径。至于选择器,KVC 不适用于 C 指针类型。您必须使用运行时函数来访问它:SEL action = ((SEL (*)(id, const char*))object_getIvar)(targetContainer, class_getInstanceVariable([targetContainer class], "_action"))
【解决方案2】:

UIGestureRecognizer 内部维护一个array of targets。该数组没有公共访问权限。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      相关资源
      最近更新 更多