2013-10-18 79 views
0

我有一个UITableView,它有一些自定义单元格。在自定义单元格内,我有一个主要的UIImageView。当单元格被创建时,我将一个Tap Gesture识别器添加到图像视图中。如何从单元格中另一项的手势获取单元格引用

当图像被点击我运行以下:

- (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被调用。这是不正确的,它不应该被调用,只有手势记录相关的handleTap方法。应该被调用。我如何确保didSelectRowAtIndexPath未被调用,因为在单元格被实际(正确)选择时需要运行其他代码。

回答

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之间发生了变化。

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

+0

感谢这种方法。这很好,但是我怎么会把indexPath传入prepareForSegue方法。目前我传入imageView作为方法的发送者,以便我可以链接到图像(每个问题),但是如何在prepareForSegue方法中实际需要此参数时传递indexPath。 – StuartM

+0

我能够在prepareForSegue方法中复制上述内容,没有任何问题,这很好。谢谢你的帮助。 – StuartM

0

1 .-为了让细胞可以检查的UIImageView的上海华拍了拍

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

2:要禁用一个UITableView小区选择

[self.yourTableView setAllowsSelection:NO]; 
相关问题