在iOS中获取UIGestureRecognizer的Action

Posted

技术标签:

【中文标题】在iOS中获取UIGestureRecognizer的Action【英文标题】:Getting the Action of UIGestureRecognizer in iOS 【发布时间】: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 或建议将不胜感激。

提前谢谢你。

【问题讨论】:

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

【讨论】:

以上是关于在iOS中获取UIGestureRecognizer的Action的主要内容,如果未能解决你的问题,请参考以下文章

关于 Cocoa Touch 中单例的问题

在 SKScene、iOS、Swift 中获取/设置像素颜色

如何在 Firestore (iOS) 中获取对象

如何在比 iOS 6.0 更早的 iOS 版本中从 UITextRange 获取矩形

我们可以在iOS中获取iOS系统铃声吗?

如何在 socket.io 1.0 中获取房间的客户列表