将手势添加到UITableViewCell

时间:2013-07-21 05:49:14

标签: uitableview uiswipegesturerecognizer

我正在尝试向tableViewCell添加滑动手势识别器,但它不起作用。

这是我创建单元格的方式:

CellIdentifier = @"EventsSentCell";
    nibObjcet = [[NSBundle mainBundle] loadNibNamed:@"EventsSentCell" owner:self options:nil];

EventsSentCell *cell = [[EventsSentCell alloc] init];
cell = (EventsSentCell *)[nibObjcet objectAtIndex:0];

这就是我的单元格在.m文件中的启动方式:

-(id)init{
    self = [super init];
    if (self) {
        leftSwipe = [[UISwipeGestureRecognizer alloc] init];
        leftSwipe.direction= UISwipeGestureRecognizerDirectionLeft;
        [leftSwipe addTarget:self action:@selector(swipedLeft)];
        [self addGestureRecognizer:leftSwipe];
    }
    return self;
}

这就是我在.h文件中声明手势识别器的方式:

@property (nonatomic,strong) IBOutlet UISwipeGestureRecognizer *leftSwipe;

但由于某种原因,我的方法没有被调用。

有什么想法吗?

由于

我尝试过以下代码:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    NSLog(@"%@",gestureRecognizer);
    return YES;
}

我在向左滑动后得到的结果是:

<UILongPressGestureRecognizer: 0xa9d99a0; state = Possible; view = <UITableViewCellContentView 0xa9d8ce0>; target= <(action=_longPressGestureRecognized:, target=<EventsSentCell 0xa9d8bb0>)>>

2 个答案:

答案 0 :(得分:0)

在回答实际问题之前,请允许我在您的代码中指出其他一些问题。

EventsSentCell *cell = [[EventsSentCell alloc] init];
cell = (EventsSentCell *)[nibObjcet objectAtIndex:0];

首先,这两行没有意义。您在没有笔尖的情况下分配和初始化EventSentCell的实例。执行此操作后,您将覆盖cell以指向由loadNibNamed:初始化的实例。您可以将其简化为EventsSentCell = (EventsSentCell *)nibObject[0];
但即使经过这些优化,这仍然不是实施cellForRowAtIndexPath:的推荐方法。您应该在registerNib:forCellReuseIdentifier:中使用viewDidLoad,然后使用 dequeueReusableCellWithIdentifier:forIndexPath:获取一个单元格,并完全不用自己加载笔尖。

接下来,

@property (nonatomic,strong) IBOutlet UISwipeGestureRecognizer *leftSwipe;

您将此属性声明为IBOutlet,但您只在代码中设置它(据我所知),更具体地说是init方法。你可以完全忽略IBOutlet

init方法可能也是导致问题的原因。使用loadNibNamed实例化视图时,会调用initWithCoder:而不是init

实现你的自定义初始化代码(在这种情况下添加一个手势识别器),它应该可以正常工作。

答案 1 :(得分:0)

您的'init'方法未被调用,因此手势识别器无法设置。

您可以尝试在awakeFromNib初始化,但无论如何,您的细胞创建看起来都是非常规的。

假设您正在使用带有Xib文件的自定义单元格类,我就是这样做的。

  1. 创建EventsSentCell对象.m和.h文件

  2. 创建一个xib文件“EventsSentCell.xib”

  3. 在xib文件中,删除默认的顶级视图并将其替换为UITableViewCell(您可以从对象库中拖出一个)。在身份检查器中,将其类更改为EventsSentCell

  4. 在你的表viewController的viewDidLoad ...

     UINib* EventsSentNib = [UINib nibWithNibName:@"EventsSentCell" 
                                           bundle:nil];
     [self.tableView registerNib:EventsSentNib 
          forCellReuseIdentifier:@"EventsSentCell"];
    
  5. cellForRowAtIndexPath方法中:

    UITableViewCell *cell = 
           [tableView dequeueReusableCellWithIdentifier:@"EventsSentCell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] 
                            initWithStyle:UITableViewCellStyleDefault   
                          reuseIdentifier:@"EventsSentCell"];
      }
    
  6. 在EventsSentCell.m中,从-awakeFromNib

  7. 触发初始化代码

    您的初始化代码:

        leftSwipe = [[UISwipeGestureRecognizer alloc] init];
        leftSwipe.direction= UISwipeGestureRecognizerDirectionLeft;
        [leftSwipe addTarget:self action:@selector(swipedLeft)];
        [self addGestureRecognizer:leftSwipe];
    

    将按原样运作。

    您获得了对您的gestureRecogniser委托方法的UILongPressGestureRecognizer:...响应,因为这是Apple提供的内置手势识别器,其代理设置为单元格。当您的代码正常运行时,如果您还将您的手势识别器的委托设置为单元格(leftSwipe.delegate = self),您可能会看到UISwipeGestureRecognizer:...

    同时注意到UILongPressGestureRecognizer的视图不是单元格,而是单元格的contentView。这是您的单元格视图层次结构的超级视图,您应该将所有单元格的内容附加到该层次结构。虽然您将手势识别器附加到单元格时可以正常工作,但我建议您在此处关注Apple:

            [self.contentView addGestureRecognizer:leftSwipe];
    

    然后手势将正确地跟随单元格的视图层次结构。