50

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

誰か私にいくつかの提案をしてもらえますか? 前もって感謝します。

4

24 に答える 24

70

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

contentView.userInteractionEnabled = NO;

nib からカスタム セルをロードした後に呼び出されます。nibファイルで定義されたビューを作成した後、このコンテンツビューが作成され、最上位の子ビューとして設定されているようです。

于 2013-10-04T16:07:17.057 に答える
32

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

于 2013-10-03T13:29:21.617 に答える
30

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

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

ビューを xib からロードしている場合は、カスタム セル ビュー、コンテンツ ビュー、およびユーザー アクションを有効にする要素から、すべてのチェック ボックスがオンになっていることを確認する必要があります。
ここに画像の説明を入力

上記の例では、DeviceViewCellコンテンツ ビュー、およびボタン要素のすべてで、「ユーザー インタラクションを有効にする」チェック ボックスがオンになっています。
カスタム セルが UITableViewCell のサブクラスとして実装され、カスタム セル ビューが別の xib ファイルから動的に読み込まれる場合、ほとんどの人を混乱させるもう 1 つのことを行う必要がありますが、その理由については後で説明します
。カスタム セルの初期化メソッドでは、次のことを行う必要があります。
self.contentView.userInteractionEnabled = NO

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

self.contentViewContent ViewInterface Builder に表示されるものとは異なります。カスタム セル ビュー内の他のすべてのビュー/要素の上にあるものとしてシステムによって作成され、default content viewビュー階層の残りのビューを覆い隠します。したがって、カスタム セル ビューの UI 要素がユーザー インタラクション イベントを受け取る前に、ユーザー インタラクションを無効にする必要があります。お役に立てれば。より良い説明があれば、私はそれを聞きたいです:-)。繰り返しますが、これは私の観察であり、他の理由がある可能性があります。議論は大歓迎です!

于 2014-10-10T22:20:27.180 に答える
6

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

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

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

于 2015-11-09T08:58:24.043 に答える
5

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

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

これは私にとってはうまくいきます。

于 2016-07-22T05:21:58.863 に答える
4

明らかに、問題が発生する可能性のある多くのことがあり、一部の修正は特定の iOS バージョンでは機能し、他のバージョンでは機能しません.

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

于 2015-12-17T21:09:15.780 に答える
4

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

IB で最初に作成したオブジェクトは UIView だったので、UITableViewCell の contentView は実行時まで追加されませんでした。

于 2014-01-10T22:05:35.617 に答える
3

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

self.contentView.Frame.size.height

は常に 44 です。

上書き方法で設定できる提案があります-self.contentView.Frame問題は解決されますself.frame(void)layoutSubviews

于 2015-04-21T11:45:17.047 に答える
2

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

于 2013-12-20T04:38:36.917 に答える
2

ストーリーボードのプロトタイプ セルの UIButton で同じ問題が発生しました。プロトタイプセルの「User Interaction Enabled」にチェックを入れることで解決しました。これは iOS 7.1 で動作しました。

于 2014-05-23T17:19:08.997 に答える
2

ここで説明されていない最も明白な間違いは、UIButton が選択されたときに異なって見えるようにするには、selectedBackgroundImage が必要であるということです。これらは、たとえば UITableViewCells とは異なります。

myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)
于 2016-06-04T14:24:51.117 に答える
1

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

ここに画像の説明を入力

于 2014-10-13T21:28:33.500 に答える
1

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

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

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

于 2013-12-19T01:15:04.590 に答える
0

私は、いくつかの内部機能を実装し、自己への接触を処理するそのセルについて透過的なビューを持っていました。

于 2014-12-04T10:08:36.150 に答える
0

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

于 2014-11-06T18:25:15.740 に答える
0

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

于 2014-03-19T10:52:36.987 に答える
0

CUSTOM セル クラスがある場合は、単純self.selectionStyle = .noneawakeFromNib()

override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.selectionStyle = .none
    }
于 2020-12-22T22:07:29.610 に答える
0

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

于 2016-04-25T05:49:39.587 に答える
0

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

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

于 2014-05-09T17:31:50.690 に答える
-1

わかりました、この問題の解決策を見つけましたが、それは巨大なハックのようです。ただし、思いついたのはこれだけです(ここでは他に何もうまくいきませんでした)。

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

于 2014-09-23T17:04:57.897 に答える