web-dev-qa-db-ja.com

ボタンアクションの取得:UICollectionView Cell

私はnibによってUICollectionViewCellを作成し、その中にボタンを追加し、.hファイルと.mファイルを作成して、クラスをnibsに追加しましたfile's owner。thenは、アウトレット経由で接続された.mにボタンアクションを記述しました。

コレクションビューに問題はありませんが、ブトンアクションをトリガーできません。コレクションセルのデリゲートが呼び出されたと思います。

ボタンアクションを取得するにはどうすればよいですか?

23
Lithu T.V

私にもこの問題がありました。サブビューはタッチイベントを受け取りません。スコットKの回避策は機能しますが、それでも何か問題があると感じました。だから私は自分のペン先をもう一度見て、UICollectionViewCellの作成に使用した元のサブビューがUIViewであることに気付きました。クラスをUICollectionViewCellのサブクラスに変更しても、XCodeはそれをUIViewと見なしているため、contentViewで発生する問題がタッチイベントをキャッチしません。

これを修正するために、UICollectionViewCellオブジェクトを確実にドラッグし、すべてのサブビューをそれに移動することで、ペン先を再作成しました。その後、タッチイベントが私のセルのサブビューで機能し始めました。

NibがUICollectionViewCellとして構成されているかどうかを確認するインジケーターは、高レベルビューのアイコンを見ることができます。

enter image description here

このように見えない場合は、おそらくタッチイベントが誤って解釈されます。

90
haider

Nibを介してUICollectionViewCellを作成すると、nibのコンテンツはセルのcontentViewに追加されません。すべてがUICollectionViewCellに直接追加されます。 Interface BuilderにnibのトップレベルのビューをUICollectionViewCellとして認識させる方法がないようです。そのため、内部のすべてのコンテンツがcontentViewに「自動的に」追加されます。

Sunkehappyが指摘したように、タッチイベントを受け取りたいものはすべてcontentViewに入れる必要があります。これはすでに作成されているので、プログラムでUIButtonをawakeFromNib時にcontentViewに移動することをお勧めします。

-(void)awakeFromNib {
    [self.contentView addSubview:self.myButton];
}
11
Scott K.

ICollectionViewCellクラスリファレンス

セルの外観を構成するには、データアイテムのコンテンツをサブビューとして表示するために必要なビューをcontentViewプロパティのビューに追加します。セル自体に直接サブビューを追加しないでください。セルはコンテンツの複数のレイヤーを管理しますが、そのコンテンツビューは1つだけです。コンテンツビューに加えて、セルは2つの背景ビューを管理します。これらのビューは、セルを選択状態と非選択状態で表示します。

次のようにawakeFromNibにボタンを追加できます。

- (void)awakeFromNib
{
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.contentView addSubview:button];
}

- (void)buttonClicked:(id)sender
{
    NSLog(@"button clicked");
}
7
sunkehappy

追加してそれを解決しました

[self bringSubviewToFront:myButton];

awakeFromNib

2
kalafun

セルの下部にあるサブビューがタッチイベントを受信しないという同様の問題がありましたが、上部は正常に機能していました。だから私は調査を開始し、次の結果を得ました:

  • インターフェースビルダーは、作成したセルのサブビューをセルのcontentViewに追加します。ただし、contentView自体はインターフェースビルダーに表示されません。
  • 私のコードは、コンテンツのサイズに合わせてセルを拡大したので、コレクションビューのセルの大部分は、Interface Builderのブループリントよりも高さが高かった
  • 何らかの理由で、セル自体の「サイズ変更サブビュー」プロパティがNOに設定されていました。これにより、インターフェイスビルダー内の不可解で目に見えないcontentViewが、元々インターフェイスビルダーにあったセルと同じサイズのままだったため、contentViewの境界外にあるサブビューは、タッチを受けず、応答しませんでした。

Interface Builderでセルの「自動サイズ変更サブビュー」をYESに設定すると、問題が解決しました!

1
Zoltán Lippai

受け入れられた答えがわかりにくいので、簡単な答えを出してみます。

UICollectionViewCellには2つのタイプがあります。

  1. コレクションビューセル
  2. コレクションの再利用可能なビュー

ボタンのアクションが機能しないという点で、コレクションの再利用可能なビューを使用しました。

次に、受け入れられた回答に従って、ボタンアクションのみが機能しているという点で、コレクションビューセルを使用しようとしました。画像の2番目のオブジェクトを使用します。正常に動作します。

enter image description here

0
R. Mohan