23

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

コレクション ビューは正常に表示されていますが、ボタン アクションをトリガーできません。コレクションセルのデリゲートが呼び出されると思います。

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

4

7 に答える 7

91

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

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

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

ここに画像の説明を入力

このように見えない場合は、おそらくタッチ イベントの解釈が間違っている可能性があります。

于 2013-07-15T19:30:39.793 に答える
11

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

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

-(void)awakeFromNib {
    [self.contentView addSubview:self.myButton];
}
于 2013-05-31T22:25:55.237 に答える
7

UICollectionViewCell クラス リファレンス

セルの外観を構成するには、データ項目のコンテンツをサブビューとして表示するために必要なビューを 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");
}
于 2012-12-07T07:19:30.330 に答える
2

追加して解決しました

[self bringSubviewToFront:myButton];

の中へawakeFromNib

于 2015-10-08T14:37:46.023 に答える
1

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

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

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

于 2014-02-07T20:53:30.353 に答える
-3

UICollectionViewCell で CollectionView のハンドルを作成する

UICollectionViewCell の .h ファイル内

@property (nonataomic, retain) UICollectionView *collView;

UICollectionViewCell の .m ファイル内

@synthesize *collView;

次に、コントローラーの実装ファイルで、foll メソッドでコレクション ビューを設定します。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
  YourCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:homePageCollViewCellIdentifier forIndexPath:indexPath];
    //NSString *str = [NSString stringWithFormat:@"HP item %d", indexPath.row+1];
    cell.collView = self.theCollectionView;
}

UICollectionViewCell の実装で

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

Button Clicked メソッドで

-(void)buttonClicked:(id)sender
{
    NSLog(@"button clicked");
    NSIndexPath *indPath = [collVw indexPathForCell:self];    
    [collVw.delegate collectionView:self.collVw didSelectItemAtIndexPath:indPath];
}
于 2013-03-08T05:04:59.323 に答える