web-dev-qa-db-ja.com

iOS 7でUITableViewCellのボタンが応答しない

テーブルビューが1つあり、各セルにボタンが1つ含まれています。 7以外のすべてのiOSバージョンで動作します。何が起こっているのかわかりません。セルは1つのxibファイルで構成されます。

誰か提案してくれませんか?前もって感謝します。

50
Xavier

私のために働いたのはこれです:

contentView.userInteractionEnabled = NO;

nibからカスタムセルを読み込んだ後に呼び出されます。 nibファイルで定義されたビューを作成した後、このコンテンツビューが作成され、トップレベルの子ビューとして設定されているようです。

69
b005t3r

Nibからセルをロードした後に[cell bringSubviewToFront:button]を呼び出すと、これが解決しました。

32
yonix

私もこの問題に苦労しており、stackoverflowとインターネットに関するさまざまな答えについて多くの調査を行いました。解決策は問題の原因によって異なります。ほとんどの場合、ユーザーアクション(タップ/クリックなど)を実行することになっている要素を使用して、以下を実行する必要があります。
myButton.userInteractionEnabled = YES;

特にUILabel/UIImageViewの場合、デフォルトではuserInteractionEnabledフラグはNOです。

ビューをxibから読み込む場合、カスタムセルビュー、コンテンツビュー、およびユーザーアクションを有効にする要素から、すべてのチェックボックスがオンになっていることを確認する必要があります。
enter image description here

上記の例では、DeviceViewCellコンテンツビュー、およびボタン要素はすべて「ser Interaction Enabled」チェックボックスがオンになっています。
[。なぜ後で:
カスタムセルの初期化メソッドでは、以下を実行する必要があります。
self.contentView.userInteractionEnabled = NO

ここで、selfは、作成したUITableViewCellのサブクラスです。繰り返しますが、カスタムセルがUITableViewCellのサブクラスとして実装され、カスタムセルビューが別のxibファイルから動的にロードされる場合、上記を行う必要があります。説明は次のとおりです。

self.contentView 同じではない Content View Interface Builderに表示されます。システムによってdefault content viewこれは、カスタムセルビュー内の他のすべてのビュー/要素の上部にあり、ビュー階層内の残りのビューを覆い隠します。したがって、カスタムセルビューのUI要素がユーザーインタラクションイベントを受け取る前に、ユーザーインタラクションを無効にする必要があります。お役に立てれば。より良い説明があれば、私はそれを聞きたいです:-)。これも私の観察であり、他の理由が考えられます。ディスカッションは大歓迎です!

27
us_david

問題は、iOS 8 SDK以降、必要に応じてペン先にcontentViewが含まれていないことです(経験から書いています。実行可能なソースがありません、申し訳ありません)。

UITableViewControllerをストーリーボードに追加すると、UITableViewCellがそのUITableViewに自動的に追加されます。このUITableViewを見ると、contentViewが表示されています。

したがって、UITableViewCellをサブクラス化して.xibで作成する場合、デフォルトのUITableViewCellの代わりにUIViewをクリックしてxibにドラッグする必要があります。次に、File OwnerクラスとUITableViewCellクラスをサブクラスに設定することを忘れないでください。

6
dulgan

同じ問題が発生しました。 IBでUIViewオブジェクトを作成し、そのクラスをUITableViewCellのサブクラスに設定したことがわかりました。

私が元々IBで作成したオブジェクトはUIViewであったため、UITableViewCell contentViewは実行時まで追加されず、UIButtonの上部にあるため選択できませんでした。

4
Collin

明らかに、間違っている可能性のあるものがいくつかあり、一部の修正は特定のiOSバージョンで機能し、他のバージョンでは機能しません。

私の問題は、cell.contentViewの直接のサブビューではない(つまり、サブビューのサブビューである)UIButtonがあったことです。タップ可能にするには、ボタンをcell.contentViewに直接追加する必要がありました。 (iOS v8以降)

4
mikejonesguy

この問題の解決策は次のとおりです。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {    
cell.bringSubviewToFront(cell.YOUR_UIView)    
}

これは私のために動作します。

私は同じ問題を抱えています。その理由は

self.contentView.Frame.size.height

常に44です。

上書きメソッドでself.contentView.Frameself.frameに設定できる提案があります-(void)layoutSubviews問題は解決されます

3
Snail

My Cell's outline

私の場合、ユーザーがやり取りしたいものはすべてContentViewの外部にあります。また、セルが選択されたときにセルが強調表示されないようにします。

すべてのラベル(名前、カテゴリなど)は、「コンテンツビュー」のすぐ下にあります。 WebsiteButtonは「コンテンツビュー」の下にありませんが、「ローカルディレクトリテーブルセル」の下にあります。

TableViewControllerメソッドtableView:cellForRowAtIndexPathには、次のコードがあります。cell.contentView.userInteractionEnabled = NO;

以上で、ユーザーはボタンと対話できます。 [cell bringSubviewToFront:cell.websiteButton];は使用しません。

3
Adrian Silveanu

他の人が指摘したように、常にサブビューをセルのコンテンツビューに追加します。 layoutSubviewsメソッドをオーバーライドした場合は、必ずスーパー実装を呼び出してください。スーパー実装の呼び出しを忘れると、予期しない結果が生じます。

2
diatche

ここで説明していない最も明らかな間違いは、UIButtonを選択したときに異なるように見えるためにはselectedBackgroundImageが必要だということです。これらは、たとえば、UITableViewCellsのようなものではありません。

myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)
2
AppreciateIt

ストーリーボードのプロトタイプセルのUIButtonでも同じ問題がありました。プロトタイプセルで「User Interaction Enabled」をチェックして解決しました。これはiOS 7.1で機能しました。

2
Mike Taverne

UITableViewCellとUICollectionViewCellの両方で同様の問題に直面しました。従うべきいくつかの手順:

  1. セルビュー自体ではなく、常にセルビューのコンテンツビューにサブビューを追加します
  2. コンテナビュー(ボタンを含む)を追加する場合、コンテナビューの自動レイアウトを無効にし、コンテナビュー内のコンテンツに対してのみ自動レイアウトを有効にします。コンテナビューにフレームレイアウトを使用します。

つまり、TableView/CollectionViewセルは、自動レイアウトが有効になっているアクション可能なサブビュー(UIButton、UISegmentedControl)を取ることができません。必要な場合は、自動レイアウトを無効にしてフレームを提供する(または)コンテナビュー内に配置する(コンテナビューは自動レイアウトを無効にする必要がある)か、アクションビュー(自動レイアウトを使用)をサブビューとしてコンテナビューに追加する。

1
Visu

私の場合、(contentViewだけでなく)セル自体の「User Interaction Enabled」も確認する必要があります。しかし、他の回答で述べたように、これが起こっている理由は複数ある可能性があるため、すべてのケースでこれが機能するとは限りません。

enter image description here

1
Jove Kuang

これらの答えはどれも私にとってはうまくいきませんでした。

この問題を修正できた唯一の方法は、テーブルセルの選択を単一からなしに設定することでした。その後、ボタンコールバックを受け取ることができました。

0
Isaac Paul

Interface Builder(ストーリーボード)を使用している場合は、必ずUser Interaction EnabledチェックボックスContent View

0
gpichler

いくつかの内部機能を実装し、自己のタッチを処理するそのセルを透過的に表示しました。

0

私はすべてをチェックしましたが、ストーリーボードで私のボタンのスーパービューが他のビューの下にあるというばかげた間違いをしました。そのため、タッチはボタンに渡されませんでした。

十分に配線された実際の解決策は、ストーリーボードに移動し、セルのコンテンツビューを選択し、「userInteractionEnabled」をチェックすることです...そうでなければ、ボタンまたはセルでuserInteractionを有効にしている場合でも、コンテンツビューは常にアクションをブロックします。

0
Summer

さて、この問題の解決策を見つけましたが、それは巨大なハックのようです。ただし、思いついたのはそれだけです(ここで他に機能するものはありませんでした)。

buttonの上に、問題のテーブルビューセルに委任するUITextFieldを追加しました。そのtableViewCellインスタンスは-(BOOL) textFieldShouldBeginEditing:(UITextField *)textFieldを実装し、NOを返します。

0
dave