web-dev-qa-db-ja.com

UICollectionViewデリゲートのタップメソッドが呼び出されない

コレクションビューがあります。データソースデリゲートはうまく機能しますが、UICollectionViewDelegate

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"didselect");
}

呼び出されませんが、デリゲートを設定しましたが(データソースで行ったように機能しました)、セルはnibから読み込まれ、UICollectionViewCellのサブクラスに接続されていますが、セルはとにかく私のタッチに反応しない。セルにあるUIImageViewでユーザー操作を有効にしました。

また:

-(BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"this is caled");
    return YES;
}

呼ばれていません!

言ったように、私は設定しました:

[self.collectionView setDelegate:self];

そしてもちろん

<UICollectionViewDelegate>

また、touchBeganオーバーライドもありません。

[〜#〜]更新[〜#〜]

奇妙な!長押しした場合にのみ呼び出されます!どうすればこれを修正できますか、delaysContentTouchesをNOに設定し、ジェスチャー認識機能を実装していません。

助けてください。ありがとう。

20
henTdev

ビュー階層のどこかにUITapGestureRecognizerがあるようです。デフォルトでは、UITapGestureRecognizersはユーザーが受け取ったタッチを消費します。つまり、階層内でその下のビューには渡されません。不正なタップジェスチャーを見つけて、この行を追加する必要があります

tapGestureRecognizer.cancelsTouchesInView = NO;

これにより、階層内でその下のビューにタッチが渡され、問題を解決できると期待されます。

38
aksh1t

TapGestureRecognizerをどこかに追加したようで、セルを選択できません。それらをチェックしてください、それが問題であるはずです。

9
Timur Kuchkarov

私は同じ問題に直面していました。カスタムUICollectionViewセルをクリックしても、クリックが検出されませんでした。私の場合、問題はCustomCellのXibでuserInteractionが有効になっていて、UICollectionviewのdidSelectItemAtIndexPathが呼び出されなかったため、ハンドラーのない特定のセルにユーザータップ情報が送信されていたことが原因でした。

3
user3895738

PSUICollectionViewでも同様の問題があり(これはiOS5でも機能します)、CollectionViewCellにボタンを配置してそのボタンのターゲットを設定することで修正しました。また、どのボタンが押されたかを知るためにタグを追加します。

1
Jasper

答えを探している他の人のための参照としてここに追加

短い答え:

テーブルビューに関連付けられているデフォルトのジェスチャー認識機能のタッチを遅らせます:

    if let gestures = tableView.gestureRecognizers{
        for gesture in gestures {
            gesture.delaysTouchesBegan = true
        }
    }

説明

すべてのテーブルビューには、ジェスチャ認識機能が関連付けられています。これにより、カスタムUItableViewセルへのタッチが遅延します。 delaysTouchesBeganをtrueに設定すると、タッチをサブビューにすばやく渡すことができます。

私の場合、それはCollectionViewControllerUItableViewCellであり、collectionView:didSelectItemAtIndexPathは遅れて呼び出されます。

0
object2.0

ur .hファイルで、CellViewControllerをインポートしてデリゲートを追加します

#import "myColleCell.h"

UIViewController<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>

ur .mファイルで、次のコードをur ViewDidLoadに追加します。

UINib *cellNib = [UINib nibWithNibName:@"myColleCell" bundle:nil];
[myCollectionView registerNib:cellNib forCellWithReuseIdentifier:@"myColleCell"];
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setItemSize:CGSizeMake(220, 220)];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[myCollectionView setCollectionViewLayout:flowLayout]; 

そしてur CellViewControllerでセルをセットアップします

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
              cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier= @"myColleCell";
    myColleCell *cell = (myColleCell *)[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    [cell setupCell:[dataArray objectAtIndex:indexPath.row]];
    //setup cell function methods placed in your CellViewController
    return cell;

}

最後に、cellView、collectionViewがユーザーインタラクティブにYESに設定されていることを確認します

0
Wilson L

userInteractionEnabledNOプロパティをUICollectionViewControllerに設定しているオブジェクトがないことを確認します。

他の人が言っているのと同じように、私はこれと同じ問題を抱えていましたが、親ビューが子ビューコントローラーとして追加しているuserInteractionEnabledへの呼び出しを削除することで修正されました。セルにUIButtonを追加し、タッチイベントを受信できないことを確認することで、これをテストできました。

0
Matt Robinson