如何从单元格中的另一个项目的手势获取单元格引用

时间:2013-10-18 22:20:17

标签: ios ios6 uitableview uigesturerecognizer

我有一个UITableView,其中包含一些自定义单元格。在自定义单元格中,我有一个主UIImageView。创建单元格后,我会在图像视图中添加Tap Gesture Recogniser。

点击图像时,我运行以下命令:

- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer {
    NSLog(@"Image tapped");
    UIImageView *imageView = (UIImageView *)gestureRecognizer.view;
    // send the image instead of self when firing the segue
    [self performSegueWithIdentifier:@"remindMeTurnInfo" sender:imageView];
}

然后我将图像传递到prepareForSegue方法中的新视图控制器:

if ([segue.identifier isEqualToString:@"remindMeTurnInfo"]) {
        UIImageView *imgView = (UIImageView *)sender;
        MESPlayedTurnReminderViewController *VC = segue.destinationViewController;
        VC.turnImage = imgView.image;
    }

问题
1.我需要一个UIImageView所在的单元格的引用。因此,用户点击其中一个单元格图像,我需要知道从哪个单元格(indexPath)中分割出来的图像。

2。我发现有时候点击图像时会调用didSelectRowAtIndexPath。这是不正确的,不应该调用,只有来自Gesture Rec的相关handleTap方法。应该叫。如何确保不调用didSelectRowAtIndexPath,因为我需要在实际(正确)选择单元格时运行其他代码。

2 个答案:

答案 0 :(得分:2)

通常有两种方法。在cellForRowAtIndexPath中的图像视图中添加一个等于indexPath.row的标记,或者从图像视图中向上搜索视图层次结构,直到找到一个UITableViewCell(或子类)。这可以这样做:

- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer {
    UIImageView *imageView = (UIImageView *)gestureRecognizer.view;
    UIView *superview = imageView.superview;
    while (![superview isKindOfClass:[UITableViewCell class]]) {
        superview = superview.superview;
    }
    NSLog(@"indexPath.row is: %d", [self.tableView indexPathForCell:(UITableViewCell *)superview].row);
} 

搜索而不是使用像imageView.superview.superview(可在iOS 6中使用)之类的东西的原因是层次结构可以在不同版本的iOS中更改,事实上,它确实在iOS 6和iOS之间发生了变化7。

至于你的第二个问题,可能是因为你不小心点击了细胞而不是图像视图。除了使图像视图更大,因此更容易点击,我没有看到修复。

答案 1 :(得分:0)

1.-要获取单元格,您可以检查UIImageView轻击的超级视图

- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer
{    
    UIImageView *imageView = (UIImageView *)gestureRecognizer.view;
    UITableViewCell *cell = (UITableViewCell *)imageView.superview;
}

2.-禁用UITableView上的单元格选择

[self.yourTableView setAllowsSelection:NO];