在iOS中获取UIGestureRecognizer的操作

10

我已经在“tableView:didSelectRowAtIndexPath”方法中使用NSLog打印了UITableviewCell手势。

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

我已经将UIScrollViewPanGestureRecognizer分配给了一个UIGestureRecognizer,以便按以下方式访问其属性:

并且我已经将这个UIScrollViewPanGestureRecognizer分配给了一个UIGestureRecognizer,以便按照以下方式访问其属性:

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

我可以访问'myGes'的所有属性,如下:

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

除了一个名为target的属性外。

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

任何意见或建议都将不胜感激。

提前感谢您。


我已经问了同样的问题,但没有结果。请参见https://dev59.com/GXnZa4cB1Zd3GeqPoU1D - Nicolas Manzini
@NicolasManzini...OOPS...这意味着没有办法了吗? - Ashok
我仍然不知道... - Nicolas Manzini
@NicolasManzini,感谢您在那个链接中提出的问题,并给予了+1的支持。由于我的声望较低,我无法在该问题下发表评论。如果您找到更好的解决方案,请通知我。 - Ashok
3个回答

9

有一种方法可以访问属性target,但我不确定这种方法能否通过苹果的批准过程。

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..这是指访问私有属性或私有方法吗? - Ashok
是的,通过KVC - Key Value Coding可以访问私有属性或私有方法。但我不确定这是否得到了苹果的鼓励。 - Ruslan Soldatenko
@Ashok Kumar .S 小补充:数组 targets 包含隐藏的类对象 UIGestureRecognizerTarget,其描述可以在此处找到:https://github.com/rpetrich/iphoneheaders/blob/master/UIKit/UIGestureRecognizerTarget.h - Ruslan Soldatenko
@RuslanSoldatenko 当访问该操作时,使用 id action = [targetContainer valueForKeyPath:@"_action"]; 应用程序会崩溃。 - Ashok
1
下划线是不必要的。KVC会自动搜索以下划线开头的实例变量,因此@"targets"@"target"更可取。此外,由于您只使用了一个键而不是键路径,因此可以使用valueforKey:而不是valueForKeyPath:。至于选择器,KVC不适用于C指针类型。您需要使用运行时函数来访问它:SEL action = ((SEL (*)(id, const char*))object_getIvar)(targetContainer, class_getInstanceVariable([targetContainer class], "_action")) - user102008
显示剩余6条评论

2

UIGestureRecognizer 内部维护着一个目标数组。这个数组没有公开的访问方式。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接