UITapGestureRecognizer无法在自定义UITableViewCell中使用

时间:2013-02-12 10:59:13

标签: ios ios5 uitapgesturerecognizer

我有一个奇怪的问题 - 当我在cellForRowAtIndexPath方法中注册TapGestureRecognizer时它工作得很完美,但是当我在单元的initWithStyle方法中注册TapGestureRecognizer时,点击识别不起作用,断点不会在处理程序中命中。

以下作品。

我已经使用相应的xib文件创建了自定义表格视图单元并进行了注册。

[self.tableView registerNib:[UINib nibWithNibName:@"MyCell"
                                               bundle:[NSBundle mainBundle]]
         forCellReuseIdentifier:@"cell"];
...

and in the cellForRowAtIndexPath 
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
...
 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(didTapCell:)];
    [tap setNumberOfTapsRequired:1];
    [cell addGestureRecognizer:tap];

以下不起作用

@implementation MyCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleCellTap:)];
        [tgr setDelegate:self];
        [tgr setNumberOfTapsRequired:1];
        [tgr setNumberOfTouchesRequired:1];

        [self addGestureRecognizer:tgr];
        //[self.contentView addGestureRecognizer:tgr]; also doesn't work
    }
    return self;
}

我可以离开工作解决方案,但我想通过我的代表将手势识别移动到单元初始化和点击事件。

如果我在单元初始化中注册识别器,为什么点击识别不起作用?

2 个答案:

答案 0 :(得分:2)

您确定调用了initWithStyle:reuseIdentifier吗?如果您为单元格注册一个笔尖,则必须使用initWithCoder:

在我的一个项目中,我有这个

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
        pan.delegate = self;
        self.gestureRecognizers = [NSArray arrayWithObject:pan];
    }
    return self;
}

所以我使用的是pan手势识别器,它可以在init方法中运行。

答案 1 :(得分:1)

您已为特定的小区标识符注册了xib。现在tableview将根据需要自动为您实例化一个单元格(当您调用dequeReusableCell ...时)但是initWithStyle:reuseIdentifier方法不会被调用,因此您的手势识别器永远不会被创建/添加。

如果在使用注册的xib时确实需要'init',请覆盖自定义单元类中的awakeFromNib并将代码放在那里。我通常将我的'init'代码放在一个单独的方法中,并从initWithStyle和awakeFromNib覆盖中调用它。