我有一个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
,因为我需要在实际(正确)选择单元格时运行其他代码。
答案 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];