テーブルビューが1つあり、各セルにボタンが1つ含まれています。 7以外のすべてのiOSバージョンで動作します。何が起こっているのかわかりません。セルは1つのxibファイルで構成されます。
誰か提案してくれませんか?前もって感謝します。
私のために働いたのはこれです:
contentView.userInteractionEnabled = NO;
nibからカスタムセルを読み込んだ後に呼び出されます。 nibファイルで定義されたビューを作成した後、このコンテンツビューが作成され、トップレベルの子ビューとして設定されているようです。
Nibからセルをロードした後に[cell bringSubviewToFront:button]
を呼び出すと、これが解決しました。
私もこの問題に苦労しており、stackoverflowとインターネットに関するさまざまな答えについて多くの調査を行いました。解決策は問題の原因によって異なります。ほとんどの場合、ユーザーアクション(タップ/クリックなど)を実行することになっている要素を使用して、以下を実行する必要があります。myButton.userInteractionEnabled = YES;
特にUILabel/UIImageViewの場合、デフォルトではuserInteractionEnabled
フラグはNO
です。
ビューをxibから読み込む場合、カスタムセルビュー、コンテンツビュー、およびユーザーアクションを有効にする要素から、すべてのチェックボックスがオンになっていることを確認する必要があります。
上記の例では、DeviceViewCell、コンテンツビュー、およびボタン要素はすべて「ser Interaction Enabled」チェックボックスがオンになっています。
[。なぜ後で:
カスタムセルの初期化メソッドでは、以下を実行する必要があります。self.contentView.userInteractionEnabled = NO
ここで、self
は、作成したUITableViewCellのサブクラスです。繰り返しますが、カスタムセルがUITableViewCellのサブクラスとして実装され、カスタムセルビューが別のxibファイルから動的にロードされる場合、上記を行う必要があります。説明は次のとおりです。
self.contentView
同じではない Content View
Interface Builderに表示されます。システムによってdefault content view
これは、カスタムセルビュー内の他のすべてのビュー/要素の上部にあり、ビュー階層内の残りのビューを覆い隠します。したがって、カスタムセルビューのUI要素がユーザーインタラクションイベントを受け取る前に、ユーザーインタラクションを無効にする必要があります。お役に立てれば。より良い説明があれば、私はそれを聞きたいです:-)。これも私の観察であり、他の理由が考えられます。ディスカッションは大歓迎です!
問題は、iOS 8 SDK以降、必要に応じてペン先にcontentViewが含まれていないことです(経験から書いています。実行可能なソースがありません、申し訳ありません)。
UITableViewController
をストーリーボードに追加すると、UITableViewCellがそのUITableView
に自動的に追加されます。このUITableView
を見ると、contentView
が表示されています。
したがって、UITableViewCell
をサブクラス化して.xibで作成する場合、デフォルトのUITableViewCell
の代わりにUIView
をクリックしてxibにドラッグする必要があります。次に、File OwnerクラスとUITableViewCell
クラスをサブクラスに設定することを忘れないでください。
同じ問題が発生しました。 IBでUIViewオブジェクトを作成し、そのクラスをUITableViewCellのサブクラスに設定したことがわかりました。
私が元々IBで作成したオブジェクトはUIViewであったため、UITableViewCell contentViewは実行時まで追加されず、UIButtonの上部にあるため選択できませんでした。
明らかに、間違っている可能性のあるものがいくつかあり、一部の修正は特定のiOSバージョンで機能し、他のバージョンでは機能しません。
私の問題は、cell.contentViewの直接のサブビューではない(つまり、サブビューのサブビューである)UIButtonがあったことです。タップ可能にするには、ボタンをcell.contentViewに直接追加する必要がありました。 (iOS v8以降)
この問題の解決策は次のとおりです。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell.bringSubviewToFront(cell.YOUR_UIView)
}
これは私のために動作します。
私は同じ問題を抱えています。その理由は
self.contentView.Frame.size.height
常に44です。
上書きメソッドでself.contentView.Frame
をself.frame
に設定できる提案があります-(void)layoutSubviews
問題は解決されます
私の場合、ユーザーがやり取りしたいものはすべてContentViewの外部にあります。また、セルが選択されたときにセルが強調表示されないようにします。
すべてのラベル(名前、カテゴリなど)は、「コンテンツビュー」のすぐ下にあります。 WebsiteButtonは「コンテンツビュー」の下にありませんが、「ローカルディレクトリテーブルセル」の下にあります。
TableViewControllerメソッドtableView:cellForRowAtIndexPathには、次のコードがあります。cell.contentView.userInteractionEnabled = NO;
以上で、ユーザーはボタンと対話できます。 [cell bringSubviewToFront:cell.websiteButton];は使用しません。
他の人が指摘したように、常にサブビューをセルのコンテンツビューに追加します。 layoutSubviews
メソッドをオーバーライドした場合は、必ずスーパー実装を呼び出してください。スーパー実装の呼び出しを忘れると、予期しない結果が生じます。
ここで説明していない最も明らかな間違いは、UIButtonを選択したときに異なるように見えるためにはselectedBackgroundImageが必要だということです。これらは、たとえば、UITableViewCellsのようなものではありません。
myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)
ストーリーボードのプロトタイプセルのUIButtonでも同じ問題がありました。プロトタイプセルで「User Interaction Enabled」をチェックして解決しました。これはiOS 7.1で機能しました。
UITableViewCellとUICollectionViewCellの両方で同様の問題に直面しました。従うべきいくつかの手順:
つまり、TableView/CollectionViewセルは、自動レイアウトが有効になっているアクション可能なサブビュー(UIButton、UISegmentedControl)を取ることができません。必要な場合は、自動レイアウトを無効にしてフレームを提供する(または)コンテナビュー内に配置する(コンテナビューは自動レイアウトを無効にする必要がある)か、アクションビュー(自動レイアウトを使用)をサブビューとしてコンテナビューに追加する。
私の場合、(contentViewだけでなく)セル自体の「User Interaction Enabled」も確認する必要があります。しかし、他の回答で述べたように、これが起こっている理由は複数ある可能性があるため、すべてのケースでこれが機能するとは限りません。
これらの答えはどれも私にとってはうまくいきませんでした。
この問題を修正できた唯一の方法は、テーブルセルの選択を単一からなしに設定することでした。その後、ボタンコールバックを受け取ることができました。
Interface Builder(ストーリーボード)を使用している場合は、必ずUser Interaction Enabled
チェックボックスContent View
いくつかの内部機能を実装し、自己のタッチを処理するそのセルを透過的に表示しました。
私はすべてをチェックしましたが、ストーリーボードで私のボタンのスーパービューが他のビューの下にあるというばかげた間違いをしました。そのため、タッチはボタンに渡されませんでした。
十分に配線された実際の解決策は、ストーリーボードに移動し、セルのコンテンツビューを選択し、「userInteractionEnabled」をチェックすることです...そうでなければ、ボタンまたはセルでuserInteractionを有効にしている場合でも、コンテンツビューは常にアクションをブロックします。
さて、この問題の解決策を見つけましたが、それは巨大なハックのようです。ただし、思いついたのはそれだけです(ここで他に機能するものはありませんでした)。
button
の上に、問題のテーブルビューセルに委任するUITextFieldを追加しました。そのtableViewCellインスタンスは-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField
を実装し、NO
を返します。