在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的主要内容,如果未能解决你的问题,请参考以下文章
在 SKScene、iOS、Swift 中获取/设置像素颜色