テーブルビューが 1 つあり、各セルには 1 つのボタンが含まれています。7 を除くすべての iOS バージョンで問題なく動作しています。何が起こっているのかわかりません。セルは 1 つの xib ファイルで構築されます。
誰か私にいくつかの提案をしてもらえますか? 前もって感謝します。
テーブルビューが 1 つあり、各セルには 1 つのボタンが含まれています。7 を除くすべての iOS バージョンで問題なく動作しています。何が起こっているのかわかりません。セルは 1 つの xib ファイルで構築されます。
誰か私にいくつかの提案をしてもらえますか? 前もって感謝します。
私のために働いたのはこれです:
contentView.userInteractionEnabled = NO;
nib からカスタム セルをロードした後に呼び出されます。nibファイルで定義されたビューを作成した後、このコンテンツビューが作成され、最上位の子ビューとして設定されているようです。
[cell bringSubviewToFront:button]
ペン先からセルをロードした後に呼び出すと、これが解決しました。
私もこの問題に苦労しており、スタックオーバーフローとインターネットでさまざまな回答について多くの調査を行いましたが、解決策は問題の原因によって異なります。ほとんどの場合、ユーザー アクション (タップ/クリックなど) を実行することになっている要素で次の操作を行う必要があります。
myButton.userInteractionEnabled = YES;
特に UILabel/UIImageView の場合、デフォルトではuserInteractionEnabled
フラグはNO
です。
ビューを xib からロードしている場合は、カスタム セル ビュー、コンテンツ ビュー、およびユーザー アクションを有効にする要素から、すべてのチェック ボックスがオンになっていることを確認する必要があります。
上記の例では、DeviceViewCell、コンテンツ ビュー、およびボタン要素のすべてで、「ユーザー インタラクションを有効にする」チェック ボックスがオンになっています。
カスタム セルが UITableViewCell のサブクラスとして実装され、カスタム セル ビューが別の xib ファイルから動的に読み込まれる場合、ほとんどの人を混乱させるもう 1 つのことを行う必要がありますが、その理由については後で説明します
。カスタム セルの初期化メソッドでは、次のことを行う必要があります。
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
a が見えますcontentView
。
したがって、 an をサブクラスUITableViewCell
化して .xib で作成する場合、 a をクリックして、デフォルトの代わりに xib にドラッグするUITableViewCell
UIView
必要があります。UITableViewCell
次に、File Owner クラスとクラスをサブクラスに設定することを忘れないでください。
この問題の解決策は次のとおりです。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell.bringSubviewToFront(cell.YOUR_UIView)
}
これは私にとってはうまくいきます。
明らかに、問題が発生する可能性のある多くのことがあり、一部の修正は特定の iOS バージョンでは機能し、他のバージョンでは機能しません.
私の問題は、cell.contentView の直接のサブビューではない UIButton を持っていたことです (つまり、サブビューのサブビューでした)。ボタンをタップ可能にするには、ボタンを cell.contentView に直接追加する必要がありました。(iOS v8+)
同じ問題が発生しました。IB で UIView オブジェクトを作成し、そのクラスを UITableViewCell のサブクラスに設定したことがわかりました。
IB で最初に作成したオブジェクトは UIView だったので、UITableViewCell の contentView は実行時まで追加されませんでした。
私は同じ問題を抱えています。その理由は
self.contentView.Frame.size.height
は常に 44 です。
上書き方法で設定できる提案があります-self.contentView.Frame
問題は解決されますself.frame
(void)layoutSubviews
他の人が指摘したように、常にサブビューをセルのコンテンツ ビューに追加してください。メソッドをオーバーライドした場合はlayoutSubviews
、必ずスーパー実装を呼び出してください。スーパー実装を呼び出すのを忘れると、予期しない結果が生じます。
ストーリーボードのプロトタイプ セルの UIButton で同じ問題が発生しました。プロトタイプセルの「User Interaction Enabled」にチェックを入れることで解決しました。これは iOS 7.1 で動作しました。
ここで説明されていない最も明白な間違いは、UIButton が選択されたときに異なって見えるようにするには、selectedBackgroundImage が必要であるということです。これらは、たとえば UITableViewCells とは異なります。
myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)
私の場合、セル自体 (contentView だけでなく) の「User Interaction Enabled」もチェックする必要があります。しかし、他の回答で述べたように、これが発生する理由には複数の理由がある可能性があるため、これがすべてのケースで機能するとは限りません。
UITableViewCell と UICollectionViewCell の両方で同様の問題に直面しました。従うべきいくつかのステップ:
つまり、TableView/CollectionView セルは、自動レイアウトが有効になっているアクション可能なサブビュー (UIButton、UISegmentedControl) を取ることができません。必要に応じて、自動レイアウトを無効にしてフレームを提供する (または) それらをコンテナー ビュー内に配置し (コンテナー ビューでは自動レイアウトを無効にする必要があります)、アクション可能なビュー (自動レイアウトを使用) をサブビューとしてコンテナー ビューに追加します。 .
私は、いくつかの内部機能を実装し、自己への接触を処理するそのセルについて透過的なビューを持っていました。
十分に配線されていますが、実際の解決策は、ストーリーボードに移動し、セルで contentview を選択し、「userInteractionEnabled」をチェックすることです...そうしないと、ボタンまたはセルで userInteraction を有効にしても、contentview は常にアクションをブロックします.
Interface Builder(ストーリーボード)を使用している場合は、必ずチェックUser Interaction Enabled
ボックスをオンにしてくださいContent View
CUSTOM セル クラスがある場合は、単純self.selectionStyle = .none
にawakeFromNib()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.selectionStyle = .none
}
すべてをチェックしましたが、ストーリーボードでボタンのスーパービューが他のビューの下にあるというばかげた間違いを犯しました。そのため、タッチがボタンに渡されませんでした。
これらの答えはどれも私にとってはうまくいきませんでした。
この問題を解決できた唯一の方法は、テーブル セルの選択を単一からなしに設定することでした。その後、ボタンコールバックを受けることができました。
わかりました、この問題の解決策を見つけましたが、それは巨大なハックのようです。ただし、思いついたのはこれだけです(ここでは他に何もうまくいきませんでした)。
問題button
のテーブル ビュー セルに委任する UITextField を追加しました。その tableViewCell インスタンスは を実装-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField
して返しますNO
。