UITapGestureRecognizer用于UITableView中的自定义单元格

时间:2014-08-13 13:40:19

标签: ios uitableview uitapgesturerecognizer didselectrowatindexpath

在我的iPhone应用程序中,我通过继承UITableView使用自定义表格单元格UITableViewCell。我们假设我的自定义单元类名称为 ItemTableViewCell 。相关的 ItemTableViewCell.xib 的子视图为UIView,其名称为 infoView

我希望 infoView 识别单击/触摸它。如果它只是一个点击,我可以通过使用故事板添加UITapGestureRecognizer并为此设置一个动作方法来实现。但我需要的是在识别infoView的点击/触摸时,我需要将相关的表行信息传递给目标方法/选择器。

如果我进一步解释这种情况,UITableViewNSArray UITableViewCell组成。该自定义单元格的底栏带有一个名为 infoView 的子视图。通过点击/触摸 infoView ,它应该调用一个方法,并将相关的NSArray元素作为参数。通过点击/触摸单元格的其余部分,它应该正常调用didSelectRowAtIndexPath方法。

2 个答案:

答案 0 :(得分:4)

我找到了解决方案。当我正在创建自定义单元格时,我将UITapGestureRecognizer添加到相关的UIVIew(在我的情况下是infoView),如下所示。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOnInfoView:)];
[tap setNumberOfTouchesRequired:1];
[tap setNumberOfTapsRequired:1];
[cell.infoView addGestureRecognizer:tap];
[cell.infoView setUserInteractionEnabled:YES];
[cell.infoView setTag:realIndex];

从最后一行可以看出,我将单元格索引而不是单元格数据传递给选择器,选择器将在识别轻击手势后触发。

同时我维护一个NSMutableArray来存储单元格的数据。您可以理解,每个单元格索引都会同时存在NSArray元素。

这是我的选择器出现的方式;

- (void)tappedOnInfoView:(UIGestureRecognizer *)sender {

通过使用以下代码,您可以获得与点击发生的客人相关的索引

sender.view.tag

使用以下代码片段我可以获取我存储在NSMutableArray中的单元格的详细信息

[myMutArray objectAtIndex:sender.view.tag];

完成任务:)

答案 1 :(得分:0)

在Tableview SuperClass中实现手势操作。或者您可以在UITableViewCell子类中使用自定义委托。在UITableView子类中声明一个协议。

@protocol customCellDelegate <NSObject>

@required
-(void)selectedCellInIndexPath : (NSIndexPath *)indexpath;
@end

在UITableView子类

中设置此属性
@property (nonatomic, strong)NSIndexPath *indexpath;
@property (nonatomic, strong) id <customCellDelegate> delegate;

然后在您的UITableView子类手势操作中添加此行

if(self.delegate){
   [self.delegate selectedCellInIndexPath: self.indexpath];
}

在tableview数据源方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

实施此代码

cell.delegate = (id)self;
cell.indexpath = indexPath;

在Uitableview超级类中只需实现此方法

-(void)selectedCellInIndexPath : (NSIndexPath *)indexpath{
//display uiimagepickercontroller modally or anything else here
}