編集: 皆様ありがとうございます。しかし、これは一般的になりすぎています。この質問は削除しようと思います。私はあなたのすべての助けに感謝します!
内部に UILabel を持つ大きな UITableViewCell があり、そのラベルに対するユーザーのシングルタップまたはタッチを検出したいと考えています。サブクラス化された 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 には、ユーザーのタップを妨げるものは何もありません。でも不思議なことに、そこにブレークポイントを置いたら、セルをタップしてもヒットしません。したがって、ここには他にも問題があると思います。しかし、なぜそうなのかはわかりません。