私はnibによってUICollectionViewCell
を作成し、その中にボタンを追加し、.hファイルと.mファイルを作成して、クラスをnibsに追加しましたfile's owner
。thenは、アウトレット経由で接続された.mにボタンアクションを記述しました。
コレクションビューに問題はありませんが、ブトンアクションをトリガーできません。コレクションセルのデリゲートが呼び出されたと思います。
ボタンアクションを取得するにはどうすればよいですか?
私にもこの問題がありました。サブビューはタッチイベントを受け取りません。スコットKの回避策は機能しますが、それでも何か問題があると感じました。だから私は自分のペン先をもう一度見て、UICollectionViewCellの作成に使用した元のサブビューがUIViewであることに気付きました。クラスをUICollectionViewCellのサブクラスに変更しても、XCodeはそれをUIViewと見なしているため、contentViewで発生する問題がタッチイベントをキャッチしません。
これを修正するために、UICollectionViewCellオブジェクトを確実にドラッグし、すべてのサブビューをそれに移動することで、ペン先を再作成しました。その後、タッチイベントが私のセルのサブビューで機能し始めました。
NibがUICollectionViewCellとして構成されているかどうかを確認するインジケーターは、高レベルビューのアイコンを見ることができます。
このように見えない場合は、おそらくタッチイベントが誤って解釈されます。
Nibを介してUICollectionViewCell
を作成すると、nibのコンテンツはセルのcontentViewに追加されません。すべてがUICollectionViewCell
に直接追加されます。 Interface BuilderにnibのトップレベルのビューをUICollectionViewCell
として認識させる方法がないようです。そのため、内部のすべてのコンテンツがcontentViewに「自動的に」追加されます。
Sunkehappyが指摘したように、タッチイベントを受け取りたいものはすべてcontentViewに入れる必要があります。これはすでに作成されているので、プログラムでUIButton
をawakeFromNib時にcontentViewに移動することをお勧めします。
-(void)awakeFromNib {
[self.contentView addSubview:self.myButton];
}
セルの外観を構成するには、データアイテムのコンテンツをサブビューとして表示するために必要なビューを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");
}
追加してそれを解決しました
[self bringSubviewToFront:myButton];
awakeFromNib
に
セルの下部にあるサブビューがタッチイベントを受信しないという同様の問題がありましたが、上部は正常に機能していました。だから私は調査を開始し、次の結果を得ました:
Interface Builderでセルの「自動サイズ変更サブビュー」をYESに設定すると、問題が解決しました!