0

我有一个UITableView有一些自定义单元格。在自定义单元格中,我有一个 main UIImageView. 创建单元格后,我将 Tap Gesture Recognizer 添加到图像视图中。

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

- (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不调用 ,因为在实际(正确)选择单元格时我需要运行一些其他代码。

4

2 回答 2

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 之间改变。

至于您的第二个问题,这可能是因为您不小心点击了单元格而不是图像视图。除了使图像视图更大以便更容易点击之外,我没有看到解决方法。

于 2013-10-19T01:09:49.923 回答
0

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

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

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

[self.yourTableView setAllowsSelection:NO];
于 2013-10-18T22:34:32.763 回答