编辑:谢谢大家,但这已经太笼统了,因为很明显手头有更深层次的问题。我将尝试删除这个问题。感谢您的所有帮助!
我们有一个很大的 UITableViewCell,里面有一个 UILabel,我们想要检测用户在该标签上的单击或触摸。我们在子类 UITableViewCell 中添加了一个 UITapGestureRecognizer:
CGRect frame = CGRectMake(0, 10, 150, 20);
self.titleLabel = [[UILabel alloc] initWithFrame:frame];
self.titleLabel.text = self.title;
self.titleLabel.userInteractionEnabled = YES;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(expandButtonTapped:)];
singleTap.numberOfTapsRequired = 1;
singleTap.numberOfTouchesRequired = 1;
[self.titleLabel addGestureRecognizer:singleTap];
[cell.contentView addSubview:self.titleLabel];
我们还尝试将目标设置为单元格的 UITableViewController,但结果相同,操作没有执行。检查调试器时,手势确实存在并附加到标签上。
编辑:经过更多调查,如果我们向单元格添加普通 UIButton,则无法单击它。做更多的调查,但这里是 cellForRowAtIndexPath 方法:
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (![self.metaDataSections count]) {
return nil;
}
ACMTableCellMetaData *metaData = [self metaDataForIndexPath:indexPath];
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:metaData.reuseIdentifier];
if (cell == nil) {
cell = [metaData createCell];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
cell = [metaData updateCellWithCellForReuse:cell];
return cell;
}
createCell 方法:
- (UITableViewCell *)createCell
{
UITableViewCell *cell = [super createCell];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:self.reuseIdentifier];
cell.frame = CGRectMake(CGRectGetMinX(cell.contentView.frame),
CGRectGetMinY(cell.contentView.frame),
CGRectGetWidth(cell.contentView.frame),
ACM_TABLE_CELL_HEIGHT);
[self setupExpandButtonInCell:cell];
}
return cell;
}
updateCell 方法:
- (UITableViewCell *)updateCellWithCellForReuse:(UITableViewCell *)cell {
UILabel * titleLabel = (UILabel *)[cell.contentView viewWithTag:TITLE_TAG];
titleLabel = self.titleLabel;
self.cell = [super updateCellWithCellForReuse:cell];
return self.cell;
}
我剪掉了一些我认为不会影响任何东西的代码。在子类表视图中被覆盖的 didSelectRowAtIndexPath 没有任何会阻止用户点击的内容。但奇怪的是,如果我在那里设置一个断点,则在点击单元格时它永远不会被击中。所以我相信这里还有其他问题。然而,我们不明白为什么会这样。