0

私は奇妙な問題を抱えています - cellForRowAtIndexPath メソッドに TapGestureRecognizer を登録すると完璧に動作しますが、セルの initWithStyle メソッドに TapGestureRecognizer を登録するとタップ認識が機能せず、ハンドラでブレークポイントがヒットしません。

以下の作品。

対応する xib ファイルを使用してカスタム テーブル ビュー セルを作成し、登録しました。

[self.tableView registerNib:[UINib nibWithNibName:@"MyCell"
                                               bundle:[NSBundle mainBundle]]
         forCellReuseIdentifier:@"cell"];
...

and in the cellForRowAtIndexPath 
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
...
 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(didTapCell:)];
    [tap setNumberOfTapsRequired:1];
    [cell addGestureRecognizer:tap];

以下は動作しません

@implementation MyCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleCellTap:)];
        [tgr setDelegate:self];
        [tgr setNumberOfTapsRequired:1];
        [tgr setNumberOfTouchesRequired:1];

        [self addGestureRecognizer:tgr];
        //[self.contentView addGestureRecognizer:tgr]; also doesn't work
    }
    return self;
}

作業ソリューションを残すことができますが、ジェスチャ認識をセルの初期化に移動し、デリゲートを介してタップ イベントを発生させたいと考えています。

セルの初期化で認識エンジンを登録している場合、タップ認識が機能しないのはなぜですか?

4

2 に答える 2

2

本当にinitWithStyle:reuseIdentifier呼ばれていますか?initWithCoder:セルのペン先を登録する場合は、Afaikを使用する必要があります。

私のプロジェクトではこれがあります

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
        pan.delegate = self;
        self.gestureRecognizers = [NSArray arrayWithObject:pan];
    }
    return self;
}

だから私はパンジェスチャレコグナイザーを使用していて、それはinitメソッド内から機能します。

于 2013-02-12T11:29:45.470 に答える
1

特定のセル識別子のxibを登録しました。これで、テーブルビューは必要に応じて(dequeReusableCellを呼び出すときに...)セルを自動的にインスタンス化しますが、initWithStyle:reuseIdentifierメソッドは呼び出されないため、ジェスチャレコグナイザーが作成/追加されることはありません。

登録済みのxibを使用するときに「init」する必要がある場合は、カスタムセルクラスのawakeFromNibをオーバーライドして、そこにコードを配置します。私は通常、「init」コードを別のメソッドに入れ、initWithStyleとawakeFromNibの両方のオーバーライドから呼び出します。

于 2013-02-12T11:29:38.773 に答える