如何从单元格中另一个项目的手势获取单元格引用
Posted
技术标签:
【中文标题】如何从单元格中另一个项目的手势获取单元格引用【英文标题】:How to get the cell reference from a gesture of another item in the cell 【发布时间】:2013-10-18 22:20:16 【问题描述】:我有一个UITableView
,它有一些自定义单元格。在自定义单元格中,我有一个主要的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
,因为在实际(正确)选择单元格时我需要运行一些其他代码。
【问题讨论】:
【参考方案1】:这通常有两种方法。要么在 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.
至于您的第二个问题,这可能是因为您不小心点击了单元格而不是图像视图。除了使图像视图更大以便更容易点击之外,我没有看到解决此问题的方法。
【讨论】:
感谢这种方法。这很好,但是我将如何将 indexPath 传递给 prepareForSegue 方法。目前,我将 imageView 作为方法的发送者传递,以便我可以链接到图像(根据问题),但是我将如何传递 indexPath,因为我在 prepareForSegue 方法中实际上需要它。 我能够在 prepareForSegue 方法中复制上述内容,没有任何问题,这很棒。感谢您的帮助。【参考方案2】:1.- 要获取单元格,您可以检查所点击的 UIImageView 的超级视图
- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer
UIImageView *imageView = (UIImageView *)gestureRecognizer.view;
UITableViewCell *cell = (UITableViewCell *)imageView.superview;
2.- 禁用 UITableView 上的单元格选择
[self.yourTableView setAllowsSelection:NO];
【讨论】:
以上是关于如何从单元格中另一个项目的手势获取单元格引用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自定义表格视图单元格中识别的点击手势从 UILabel 呈现视图控制器?
如何在选择单元格上的 UIcollectionViewCell 特定单元格中删除长手势?