表视图中的UIGestureRecognizer单元格获取indexPath始终返回最后一个单元格的indexPath

时间:2014-02-16 05:08:26

标签: ios cocoa-touch uitableview uigesturerecognizer

我在UITaleViewCell中有一个UIImageView,我在UIImageView中添加了一个tap识别器。

- (IBAction)ui_tapped:(UITapGestureRecognizer *)sender {
    NSIndexPath *indexPath = [CocoaHelper indexPathWithTableView:self.tableView sender:sender.view];

    RichMediaViewController *viewController = (RichMediaViewController *)[CocoaHelper viewControllerWithIdentifier:VC_RICH_MEDIA];
    Message *message = self.messages[indexPath.row];
    [viewController setupWithEntity:message];
    [self presentViewController:viewController animated:YES completion:nil];


}

+ (NSIndexPath *)indexPathWithTableView:(UITableView *)tableView sender:(id)sender {

    CGPoint hitPoint = [sender convertPoint:CGPointZero toView:tableView];
    NSIndexPath *hitIndex = [tableView indexPathForRowAtPoint:hitPoint];
    return hitIndex;

}

我使用+(NSIndexPath *)indexPathWithTableView:(UITableView *)tableView sender:(id)sender 对于单元格内的按钮,它是正确的,但对于手势,它总是返回最后一个索引路径的单元格。

enter image description here

enter image description here

修改

对点击识别器进行硬编码

if ([message.type isEqualToString:@"image"]) {
    UIImageView *view = ((ImageMessageCell *)cell).imageView;
    UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(ui_tapped:)];
    [view setGestureRecognizers:[NSArray arrayWithObject:tapRec]];
}

这是非常繁琐的编码(因为我需要检查每种类型的单元格,包括图像,视频和其他富媒体),如果您知道如何从故事板中添加它,请发布您的答案

1 个答案:

答案 0 :(得分:1)

事实证明,它不能单独地将姿势识别器添加到每个实例化原型单元,即,对于从相同原型单元实例化的所有单元仅有一个姿势识别器。

通过使用带背景图像视图的UIButton而不是使用图像视图解决了这个问题。

[self.imageButton setBackgroundImage:[UIImage imageNamed:LOADING_IMAGE_FILE] forState:UIControlStateNormal];
NSData *blob = post.thumbnailBlob;
if (blob) {
    [self.imageButton setBackgroundImage:[UIImage imageWithData:blob] forState:UIControlStateNormal];
}