0

編集: 皆様ありがとうございます。しかし、これは一般的になりすぎています。この質問は削除しようと思います。私はあなたのすべての助けに感謝します!

内部に 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 には、ユーザーのタップを妨げるものは何もありません。でも不思議なことに、そこにブレークポイントを置いたら、セルをタップしてもヒットしません。したがって、ここには他にも問題があると思います。しかし、なぜそうなのかはわかりません。

4

2 に答える 2

0

このコードを UITableViewCell を継承するクラスで記述している場合は、代わりに

[cell.contentView addSubview:self.titleLabel];

使用する

[self addSubView:self.titleLabel];

必ず実装する

-(void)expandButtonTapped:(parameter type)parameter{

}

同じクラスの中で。

于 2013-09-06T18:23:20.760 に答える