304

タブ ビュー内にテーブル ビューを持つ iOS アプリを作成しています。私のUITableViewControllerでは を実装-tableView:didSelectRowAtIndexPath:しましたが、実行時に行を選択すると、メソッドが呼び出されません。ただし、テーブル ビューには値が設定されているため、コントローラー内の他の tableView メソッドが呼び出されていることがわかります。

これを実現するために私が何を台無しにしたのか、誰か考えがありますか?

4

59 に答える 59

534

誰かが私と同じ愚かな間違いをした場合に備えて:

期待するメソッド名didSelectが誤って取得didDeselectされていないか確認してください。私が見つけるのに約2時間かかりました...

于 2012-09-25T16:55:11.947 に答える
516

問題につながる可能性があるもう 1 つのことは、選択されていない選択の種類です。

UITableView 選択種類

Single Selection通常の選択用であるべきであり、すべきではありませNo Selection

これをプログラムで行うには、次のようにします。

tableView.allowsSelection = YES
于 2012-10-12T09:05:34.480 に答える
302

別の可能性は、ここの場合のように、UITapGestureRecognizer がイベントを食べている可能性があることです: https://stackoverflow.com/a/9248827/214070

タップが通過したかのように表のセルがまだ青くハイライトされていたので、私はこの原因を疑っていませんでした。

于 2012-11-02T16:20:01.050 に答える
151

すべて良い答えですが、もう 1 つ注目すべきことがあります...

(特に、プログラムで UITableView を作成する場合)

[tableView setAllowsSelection:YES];に設定する行を設定または削除して、tableView が選択に応答できることを確認しますNO

于 2012-05-05T21:30:56.280 に答える
98

自動的に設定されるはずですが、おそらくクラスはUITableViewDelegateそのテーブルビュー用ではないようです。UITableViewController

デリゲートを他のクラスにリセットする可能性はありますか?

于 2008-11-01T19:00:09.487 に答える
94

問題が発生した場合は、UITapGestureRecognizerこれを修正できます。

  • ストーリーボードで:

ここに画像の説明を入力

コードでObjective-C

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

コードでSwift

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false
于 2015-01-30T09:22:40.883 に答える
68

この状況で私は2つのことに遭遇しました。

  1. UITableViewDelegate プロトコルを実装するのを忘れているか、クラスとテーブル ビューの間に委任アウトレットがない可能性があります。

  2. 行内にファーストレスポンダーであり、クリックを奪う UIView がある場合があります。UIButton などと言ってください。

于 2008-11-01T23:54:02.500 に答える
45

私は同じ問題を抱えていました。そして、見つけるのが大変でした。しかし、私のコードのどこかにこれがありました:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

である必要がありますreturn indexPath。それ以外の-tableView:didSelectRowAtIndexPath:場合は呼び出されていません。

于 2010-10-26T12:37:12.307 に答える
19

私と同じ問題がある場合:どうやら、tableView が編集モードの場合、このメソッドは呼び出されません。allowSelectionDuringEditing を true に設定する必要があります。

この質問を介して:編集時、`UITableView` は didSelectRowAtIndexPath を呼び出さない ??

于 2012-02-22T02:50:32.560 に答える
19

私は同じ問題を抱えていました、

その理由は、の使用でしUITapGestureRecognizerた。他の場所をタップしたときにキーボードを閉じる必要がありました。これはすべてのタップ アクションをオーバーライドすることに気付きました。そのため、didSelectRowAtIndexPath関数が呼び出されませんでした。

に関連する行にコメントを付けるとUITapGestureRecognizer、機能します。UITapGestureRecognizer selectorまた、タップされているかどうかの関数で確認できますUITableViewCell

于 2014-06-10T07:47:01.710 に答える
15

私の場合、didSelctRowAtIndexPath が呼び出されないのは、tableViewのSelectionプロパティでnoneを選択したためであり、単一選択に設定すると問題が解決しました

ここに画像の説明を入力

于 2018-09-06T16:45:53.137 に答える
11

Xcode 6.4、Swift 1.2 の場合。「タグ」の選択は IB で変更されました。方法と理由はわかりません。「単一選択」に設定すると、テーブルビューのセルが再び選択可能になりました。 ここに画像の説明を入力

于 2015-09-28T07:31:56.163 に答える
10

次のように、viewDidLoadメソッドでデータソースとデリゲートを設定することを忘れないでください。

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];
于 2013-02-21T16:59:19.040 に答える
10

別の回答が受け入れられましたが、この問題を観察した人のために、考えられる問題と解決策をもう 1 つ追加します。

自動参照カウント (ARC) がオンになっている場合、コントローラをビューのデリゲートとして割り当てた後でも、ARC がコントローラを削除しているため、コントローラへのビューのメッセージが受信されないことがあります。どうやら、UITableView のデリゲート ポインターは ARC の参照としてカウントされないため、それが唯一の参照である場合、コントローラーは解放されます。コントローラーに dealloc メソッドを実装し、そこにブレークポイントまたは NSLog 呼び出しを設定することで、これが発生しているかどうかを確認できます。

解決策は、コントローラーがもう必要なくなることが確実になるまで、別の場所で強力な参照を使用してコントローラーを追跡することです。

于 2012-03-06T21:24:19.413 に答える
9

私の問題は上記のどれでもありませんでした。そしてとても不自由です。しかし、誰かに役立つ場合に備えて、ここにリストすると思いました。

tableViewController「ベース」コントローラーである があり、このコントローラーのサブクラスを作成します。tableView:didSelectRowAtIndexPath「基本」クラスのルーチンにすべてのコードを書いていました。私のすべてのサブクラスにもデフォルトでこのルーチンが作成されていたことを完全に忘れていました (何も実行するコードはありませんでしたが)。そのため、アプリを実行すると、コードのサブクラス バージョンが実行され、何もせず、悲しくなりました。もちろん、サブクラスからルーチンを削除すると、mt "base" クラス ルーチンが使用され、ビジネスが開始されます。

知っている。笑わないで。でも、これで私が失った時間を誰かが救えるかもしれません...

于 2011-07-02T21:04:35.210 に答える
9

これに私の2セントを与えます。

カスタムUITableViewCellがあり、セル全体を覆うボタンがあったため、タッチが発生すると、セルではなくボタンが選択されました。

ボタンを削除するか、私の場合は、ボタンで User Interation Enable を false に設定して、セルが選択されているようにします。

于 2012-05-31T00:36:25.453 に答える
8

これを読んでも問題は解決しません。

チェックボックス「 User Interaction Enabled」が無効になっているカスタムセルがあります。だから、私はそれをオンにするだけです。幸運を。

于 2012-07-19T12:28:39.820 に答える
7

実装tableView:didSelectRowAtIndexPathしていないことを確認してくださいtableView:didDeSelectRowAtIndexPath

これは何度か私を手に入れました!!

于 2015-03-13T07:18:17.847 に答える
7

私はこれを持っていましたが、過去に起こったように、メソッドを追加しようとしたときにオートコンプリートに注意を払わなかったため、機能しませんでしtableView:didDeselectRowAtIndexPathtableView:didSelectRowAtIndexPath:

于 2014-07-25T01:44:35.927 に答える
6

UITapGestureRecognizer を確認してください。私の場合、テーブルビューが配置されたビューにタップジェスチャが追加されました。これは、didselect のような UITableview のユーザー操作を食べています。ビューのタップジェスチャーを無効にした後、didselect デリゲートがトリガーされました。

于 2019-08-08T12:48:41.930 に答える
5

テーブル ビューが編集モードの場合 (例: [tableView setEditing:YES animated:NO];)、設定する必要があります。tableView.allowsSelectionDuringEditing = YES;

于 2016-06-28T02:58:51.710 に答える
5

viewController次の方法があるかどうかを確認します。

- (BOOL) tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}

「NO」を返すと、didSelectRow は呼び出されません

于 2018-02-22T17:44:43.607 に答える
4

もう 1 つの間違い (私がしたように): セルにセグエを設定すると、didSelectRowAtIndexPath呼び出されません。代わりに、View Controller でセグエを設定する必要があります。

于 2013-06-29T07:56:38.390 に答える
4

私の場合、問題はサブクラスがあり、UITableViewCell次の 2 つのメソッドを実装 したことでした。しかし、メソッド adを追加して、セルの親にもタッチを通知するのを忘れていました。touchesBegan:withEvent:touchesEnded:withEvent[super touchesBegan:touches withEvent:event];[super touchesEnded:touches withEvent:event];

したがって、コードを次のように変更すると、問題が解決しました。

-(void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{
    [super touchesBegan:touches withEvent:event];
    //blah blah blah
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesEnded:touches withEvent:event];
    //rest of the code
}
于 2015-10-18T20:22:23.583 に答える
4

これらの答えはどれもうまくいきませんでした。約1時間後、私は非常に陰湿な何かを見つけました:

別のテーブル ビューのセル内にテーブル ビューがあります。とりわけ、内側のテーブル ビューを含む囲みビューを作成することにしました。このビューを contentView と呼び、xib に接続しました。

UITableViewCell には既に contentView があり、奇妙なことを行っていることがわかりました。プロパティの名前を mainContentView に変更し、この名前を変更したプロパティにビューを再接続すると、問題は解決しました。

于 2013-07-27T00:10:39.630 に答える
4

私は古いことを知っていて、問題は解決されましたが、同様の問題がありました.問題は私のカスタム UITableViewCell にあると思いましたが、解決策は完全に異なっていました-XCodeを再起動します:)そして正常に動作します! ほとんどWindowsと同じです:)

于 2009-04-23T20:29:32.267 に答える
4

私の場合、読み込み時にTableViewの高さを動的に計算します。SuperView計算ミスにより、 が のTableView外に配置されましたSuperView。はTableView正常に描画されましたが、すべての対話が無効になりました (そしてdidSelectRowAtIndexPath呼び出されませんでした)。TableViewが「アクセス可能」でないことを視覚的に示すものがないため、検出が非常に困難です。

于 2014-07-25T03:33:58.953 に答える
4

ストーリーボードのプロパティに注意してくださいUITableView。私の場合、ストーリーボードのコンボックスが「選択: 単一選択」として選択されていたため、メソッドdidSelectRowAtIndexPathを実行できませんでした。

于 2014-06-04T04:40:31.887 に答える
3

この投稿にはいくつかの驚くべき手がかりと答えがあります (おそらく私が見た中で最高の議論の 1 つです!) ここの手がかりは、私の問題が何であるかを理解するのに役立ちましたが、それでも何時間もキーボードでよだれを垂らしながら、これは他の投稿と似ていました。しかし、最終的にそれを発見した方法は少し異なっていたので、他の人がそれに出くわした場合に備えて共有したいと思いました.

私の問題は、コードでは、スーパークラスが非表示ではなく透明なフルスクリーンの「エラービュー」を追加していたことでした。しかし、それはテーブルビュー上であり、「ユーザーアクション」が YES に設定されていたため、テーブルビューへの私のタッチを傍受していました。

これは、Xcode のクールな [Debug View Hierarchy] ボタンを使用して診断しました。これは、私が行ったことと、最終的に問題をどのように診断したかを説明する注釈付きのスクリーン ショットです。

コードでは、次のことを行うだけで済みました。

errorMessageView.setUserInteractionEnabled = NO;
// or
errorMessageView.hidden = YES;

ビュー階層のデバッグ

于 2016-03-09T16:16:29.383 に答える
3

この問題に遭遇したので、ここで更新します。私の問題は、ここで見つかったものとは少し異なります。

IB を調べたところ、デリゲートが WAS に設定されていることがわかりましたが、ファイルの所有者ではなく VIEW に誤って設定されていました (テーブル ビューを右クリックして、デリゲートが指している場所を確認してください)。

誰かを助けることを願っています

于 2011-05-25T16:05:14.647 に答える
2

私の場合、この問題が発生していたのは 1 つのセルだけでした。セルには、読み取り専用モードの UITextView アウトレットが含まれていました。タップ前は読み取り専用でしたが。タップすると、キーボードが上がりました。インタラクションを無効にする必要があることが判明しました。

cell.content.scrollEnabled = NO;
cell.content.editable = NO;
cell.content.userInteractionEnabled = NO;
cell.content.delegate = nil;

[cell.content rejectFirstResponder];

于 2014-08-26T21:55:26.707 に答える
2

これはおそらく私の場合だけでしたが、バックアップからいくつかのファイルをリロードしましたが、これを含めてうまくいきませんでした。完全なクリーンを実行した後(製品>クリーンまたはShift + Command + K)、機能しました。おそらく、プリコンパイル済みヘッダーで何かがおかしくなったのでしょう。それはあなたにとって問題ではない可能性がありますが、試してみる価値はあります。

于 2013-06-13T15:00:26.973 に答える
2

-heightForRowAtIndexPath が 0 を返さないかどうかを確認します。

于 2014-03-17T09:50:00.137 に答える
2

以前のすべての回答を繰り返しましたが、どれも役に立ちませんでした。試行錯誤の末、別の解決策を見つけました。セル全体を(背景として)カバーする UIImageView がありました。デフォルトでは、UIImageView のユーザー操作は無効になっています。imageviews ユーザー インタラクション デリゲート メソッド -didSelectRowAtIndexPath: を有効にすることで、再度呼び出されました。例えば。

cell.imgView.userInteractionEnabled = YES;
于 2015-07-04T19:36:45.520 に答える
2

カスタム セルがある場合は、セルの Xib で (またはコードを介して) UserInteractionEnabled を設定することを忘れないでください。

于 2014-02-11T16:32:27.003 に答える
1

この問題が発生したばかりですが、すぐには発生しませんでした。いくつかのセルを選択すると、呼び出しが停止しdidSelectItemAtIndexPathます。allowsMultipleSelection問題は、コレクション ビューがTRUE に設定されていることに気付きました。セルの選択が解除されることはなかったため、今後の呼び出しで が呼び出されなくなりましたdidSelectItemAtIndexPath

于 2014-12-10T17:12:05.967 に答える
1

私は自分でこの問題を抱えていました。IB でビューのボーン (View と TableView のみ) を作成しましたが、デリゲートは設定されていませんでした。ファイルの所有者に配線したところ、魅力的に機能しました。::保存::

于 2010-10-14T02:08:36.097 に答える
1

カスタマイズされたテーブル コードに埋め込まれた cell.userInteractionEnabled への呼び出しがありました。

ばかげていますが、ほとんどのバグではありませんか?

于 2013-10-31T17:06:24.993 に答える
0

ブレークポイントを適用した後、コントロールが didselect 行に入らないという問題がありました。問題が見えてきました。ビューからタブ ジェスチャを削除しました。その後、うまくいきました

于 2013-04-02T10:19:04.220 に答える
0

の が で正しく設定されていなかったclass nameときに、この問題が発生しました。TableViewControllerInterface Builder

于 2021-02-07T19:50:14.777 に答える
0

この選択を確認する必要があります 単一選択である必要があり、編集中は編集が選択されていない必要があります uttableviewcell プロパティの設定を変更します テーブルビューで編集する セルスタイルはカスタムである必要があり、識別子は Rid である必要があり、セクションはなしです

于 2019-03-16T06:18:44.590 に答える
0

reloadData必ずメインスレッドで呼び出してください。ある種の非同期メソッド (例: ある種のネットワーク要求) からそのメソッドを呼び出している場合、テーブル ビューが適切に応答する場合としない場合があります (場合によっては、アプリがクラッシュすることさえあります)。

呼び出しが他のメソッド ブロックで行われている場合 (不明な場合) は、メイン スレッド コード ブロックを使用してreloadData呼び出しを実行します。

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [tableView reloadData];
}];
于 2018-01-03T17:58:17.677 に答える