UITapGestureRecognizer操作未被触发; userInteractionEnabled已设置为YES

时间:2011-06-29 09:49:20

标签: iphone uigesturerecognizer

我的程序基本上是这样的:

UIViewController - >自定义UIView - > [UIImageView数组]

我的问题是我的识别器的动作方法永远不会被调用。我已经将我的UIImageViews的userInteractionEnabled属性设置为YES。

在我的View Controller的viewDidLoad:

- (void)viewDidLoad
{
    NSEnumerator *enumerator = [grid.subviews objectEnumerator];
    UIImageView *view;
    UITapGestureRecognizer *recognizer;

    while((view = [enumerator nextObject])){
        recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openDeal:)];

        view.userInteractionEnabled = YES;
        recognizer.delegate = self;
        recognizer.numberOfTapsRequired = 1;
        [view addGestureRecognizer:recognizer];
        NSLog(@"%d", (int)view.userInteractionEnabled);
        [recognizer release];
    }
    [super viewDidLoad];
}

和openDeal定义如下:

-(void) openDeal:(UITapGestureRecognizer *) recognizer{
    NSLog(@"%@",[NSString stringWithFormat:@"%d", recognizer.view.tag]);
}

4 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,后来发现我正在为另一个视图分配相同的手势识别器实例。手势识别器只能与单个视图相关联(您可以通过UIGestureRecognizer的视图属性验证)。

确保您不会在代码中的其他位置重复使用识别器。

答案 1 :(得分:1)

我刚遇到同样的问题。

首先,检查view属性。如果在addGestureRecognizer之后它为null,则它不起作用。

我删除了对委托属性的赋值后解决了我的问题。

所以代码如下:

{
    UITapGestureRecognizer *bmSingleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(bmSingleTap:)];
    bmSingleTap.numberOfTapsRequired = 1;
    //bmSingleTap.delegate = self;
    [bookmarkTapArea addGestureRecognizer:bmSingleTap];
    NSLog(@"tap: %@ %i", bmSingleTap.view, bmSingleTap.enabled);
}

编辑:顺便说一句,后来我想重现这个bmSingleTap.view == nil效果而不能。也许,干净的重建可以解决问题。

答案 2 :(得分:0)

第一个想法: 将您的方法更改为:

-(void) openDeal:(UIGestureRecognizer *) recognizer{
    NSLog(@"%@",[NSString stringWithFormat:@"%d", recognizer.view.tag]);
}

答案 3 :(得分:0)

您的while方法看起来很奇怪?你确定它在运行吗?

尝试按照以下方式枚举子视图数组,看看它是否有帮助......

NSArray *subviewsArray = grid.subviews;
for (id imageView in subviewsArray)
{
    if ([imageView isKindOfClass:[UIImageView class]])
    {
     // run your code here
    }
}