-didSelectRowAtIndexPath:呼び出されていません


295

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

これを実現するために私が台無しにしたかもしれないアイデアは誰にもありますか?


79
また、UITableViewの上に
ジェスチャーレコグナイザーを配置して

テーブルビューが入力されている場合は注意してください。これは、DataSourceが適切に設定されていることを意味します。選択は、Delegateメソッドの一部です。したがって、おそらくDataSourceは適切に設定されていますが、デリゲートは設定されていません。
Thomas Besnehard、2013

1
こんにちはM.オスマン、あなたのコメントはまさに私自身の問題のどこが悪かったのかです。あなたはジェスチャーレコグナイザーを「で」動作させる方法を知っていUITableViewますか?
yhl 2013

15
タップして押し続けると、最終的にはが呼び出されることに気づきました-didSelectRowAtIndexPath。テーブルビューにタップジェスチャーレコグナイザーがあり、タッチを受け取る前にジェスチャーが失敗する必要があるため、私は帽子を理解しました。奇妙なことに、テーブル選択アニメーションはジェスチャー認識機能の影響を受けません。
Hlung 2013年

6
ここでも同じ問題があり、UITableViewの上にジェスチャーレコグナイザーを置くことができないことを学ぶ機会を得ました。M.オスマン、ありがとう!
vnchopra 2014年

回答:


97

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

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


7
コントローラーがUITableViewControllerであるのに、UIビルダーでプレーンな古いUIViewControllerウィジェットを使用していることを発見しました。それはうまくいきません。UIViewControllerウィジェットを削除し、代わりにUITableViewControllerをドロップすると、すべてが機能しました。
Matt Pfefferle、2008年

1
みんなのためのもう1つの境界ケース-デリゲートをコードで配線しましたが、ストーリーボードを介してデリゲートを以前に配線したことを忘れていました。
Oliver Dungey 14

1
「デリゲートを他のクラスにリセットする」方法を教えてください。私はこれと同じ問題を抱えており、解決することができません
Alfro

1
myTableViewController.tableView.delegate = xxx
Hunter

534

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

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


47
ここで同じ問題。これは、XCodeが選択の前に選択解除をオートコンプリートするためです。
user1021430 2013年

同様に、allowsSelection = falseを設定しました。これにより、選択のハイライトが削除されるだけでなく、セルが押されなくなります。
djinne95

503

問題を引き起こす可能性のあるもう1つのことは、選択された選択の種類ではありません。

UITableView選択の種類

である必要がありSingle Selection、通常の選択のために、必要がありませんことNo Selection

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

tableView.allowsSelection = YES

4
常に編集モードのシーンがあり、デフォルトを「編集中は選択しない」から変更するのを忘れているので、この問題に遭遇し続けます。
12:14の対称的な

3
この行は、viewControlller NSParameterAssert(self.tableView.allowsSelection);の-viewDidLoadメソッドに追加できます。
ニコライシュベンコフ2015

tableView.rx.itemSelected.subscribeがコールバックしなかった場合、これは問題であり、上記の修正が機能します
Dhilip

そう役立つあなたには、いくつかのコードベースを引き継ぐ、それが🙄ストーリーボードで無効にこの選択で、didSelectRowをタグ付きのボタンを使用してコードを持っているといないとき
ニティンAlabur

このtableViewのデフォルトの動作は何ですか?
Frostmourne、

296

もう1つの可能性は、UITapGestureRecognizerがイベントを食べている可能性があることです。ここではそうです:https ://stackoverflow.com/a/9248827/214070

タップが通り抜けているかのようにテーブルのセルがまだ青くハイライトされているので、私はこの原因を疑いませんでした。


これは私の問題でした!どうもありがとうございます!!以前は明らかに機能していましたが、UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];を実装した後は機能しなくなりました。[self.view addGestureRecognizer:tap];
coolcool1994

26
@ coolcool1994を実装したばかりと同じ問題がありました[タップsetCancelsTouchesInView:NO]。問題を解決しました。
nizx 2014年

ありがとう、それは私を助けます。私の場合、でdidSelectRowAtIndexPathセルを削除した後にのみ機能しませんcommitEditingStyle。そして、私が作るUITapGestureRecognizerと中tapAction:indexPathからsender.view[self.tableView indexPathForCell:sender.view])を呼び出すと[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Alexmelyon

1
これも私の問題でした..テーブルビューのタプジェスチャーを削除するコードを追加して、チャームのように動作しました-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITapGestureRecognizer * gesture = [[UITapGestureRecognizer alloc ] 初期化]; Gesture.cancelsTouchesInView = NO; [self.tableView addGestureRecognizer:gesture]; }
Udaya Sri

6
おかげで@nizx、迅速に4 tap.cancelsTouchesInView = false
Ariven Nadar 2018

150

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

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

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


9
setAllowsSelectionDuringEditing:リストに追加します(tableviewが編集モードの場合)
alex-i

ありがとうございました!IBでは、「選択」セクションの値をに変更する必要がありましたSingle Selection
Sasho 2017

90

問題が発生した場合は、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

67

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

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

  2. 行内にファーストレスポンダーであり、クリックを取り除くUIViewがある場合があります。UIButtonまたは同様のものを言います。


5
iOS 7で発生し始め、contentView内のビューの「ユーザー操作が有効」を無効にすると、これが修正されました。
2013年

1
@Kofはそれを釘付けにした。Xcode 5のインターフェースビルダーでUITableViewCellを作成すると、ユーザーインタラクションが有効な状態で作成されます= YES。不正なXcode 5!
JSD

44

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

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

それはそうreturn indexPathでなければなりません、そうでなければ-tableView:didSelectRowAtIndexPath:呼び出されていません。


2
IndexRowでのSelectRowの正しいシグネチャは次のとおりです:-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
coolcool1994

私にとっては、willSelectRowAtIndexPathを完全に削除するまで、tableView:didSelectRowAtIndexPathの呼び出しを開始しませんでした
etayluz

38

UITableViewの上にgestureRecognizerを追加した場合、didSelectRowAtIndexPath呼び出されません。

そのため、特定のビューでのタッチを回避するには、gestureRecognizerデリゲートメソッドを使用する必要があります。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

3
if ([touch.view isDescendantOfView:YourTable])
Sudheesh

29

何カ月もコードを見ていなかった後、不要だったいくつかの要件のために次のメソッドを実装することを忘れたという問題に遭遇しました

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

行を選択するには、行に対してYESを返す必要があります。


24

これらのオプションを選択する必要があります

ここに画像の説明を入力してください

ただし、UITableViewクリックしても強調表示されないようにするには、UITableViewCellプロパティを変更する必要があります。

以下のように、選択でなしオプションを選択します

ここに画像の説明を入力してください


20

UITapGestureRecognizerキーボードを閉じるためにテーブルビューをオンにしていたため、didSelectRowAtIndexPath:呼び出されませんでした。それが誰かを助けることを願っています。



19

同じ問題がありました

理由はの使用でしたUITapGestureRecognizer。他の場所をタップしたときにキーボードを閉じてほしかった。これがすべてのタップ操作を上書きすることに気づきました。つまり、didSelectRowAtIndexPath関数が呼び出されませんでした。

に関連する行をコメントにするとUITapGestureRecognizer、機能します。さらにUITapGestureRecognizer selector、タップされたかどうかの機能をチェックできますUITableViewCell


14

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

ここに画像の説明を入力してください


11

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


10

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

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

解決策は、コントローラーが不要になったことが確実になるまで、どこかで強い参照を使用してコントローラーを追跡することです。


ビューが表示されている間にコントローラーがガベージコレクションされていますか?これは実際に起こりますか?
Drux、2014

@Druxうん!これが私に起こったとき、それはiOSでガベージコレクションが使用されたObj-Cのほぼ最初のバージョンであり、正直なところ、彼らは素晴らしい仕事をしませんでした。多くの参照は、明示的または暗黙的に「弱い」ものであり、IMOは強力なはずでした。これにより、ディスプレイレイヤーでアクティブに使用されているオブジェクトのガベージコレクションのような奇妙なことが起こりました。私はiOSの作業をしばらく行っていないので、これがまだ最新バージョンで発生するかどうかはわかりません。
Andrew Gorcester 14

私のコードにはメモリサイズの問題が増えており、コードのどこか、どこか他の場所で修正しました。この直後に、didSelectが初めて呼び出されるだけではありません。これが問題を正当化するものかどうかはわかりません。
アンバーK

10

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

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

データソースを呼び出しましたが、デリゲートではありませんでした...ありがとう!
Gmeister4 2016年

9

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

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

知っている。笑わないで。しかし、多分これは私が失った時間を誰かを救うでしょう...


8

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

私はカスタムUITableViewCellを持っていて、セル全体をカバーするボタンがあったので、タッチが発生すると、セルではなくボタンが選択されました。

ボタンを削除するか、私の場合は、ボタンで[User Interation Enable]をfalseに設定しました。その方法で、セルが選択されました。


8

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

私が持っているカスタムチェックボックス「セル、有効なユーザーの相互作用は、」無効だったし。だから、スイッチを入れるだけ。幸運を。


7

私はこれを持っていますが、以前に起こったように、メソッドを追加しようとしたときにオートコンプリートに注意を払わなかったため、実際tableView:didDeselectRowAtIndexPathには実装されませんでしたtableView:didSelectRowAtIndexPath:


7

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

これは私に数回以上得られました!!


5

私は古いことを知っていて問題は解決しましたが、同様の問題がありました。問題は自分のカスタムUITableViewCellにあると思いましたが、解決策は完全に異なりました。ほとんどWindowsのようです:)


5

あなたのテーブルビューは、モードを編集している場合(例えば[tableView setEditing:YES animated:NO];)、あなたが設定する必要がありますtableView.allowsSelectionDuringEditing = YES;


4

(私がしたように)あなたがしたもう一つの間違い:あなたがセルにセグエを設定した場合、didSelectRowAtIndexPath呼び出されません。代わりに、ビューコントローラーでセグエを設定する必要があります。


4

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

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

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


4

私の場合、ロード時にTableViewの高さを動的に計算SuperViewします。計算の誤りにより、はのTableView外に配置されましたSuperViewTableViewしかし、すべての相互作用が無効になっていた、罰金を引かれた(とdidSelectRowAtIndexPath呼ばれることはなかったです)。TableViewが「アクセス可能」ではないという視覚的な兆候がないため、検出が非常に困難です。


4

私の場合の問題は、私が持っていたUITableViewCell:サブクラスを、私はこれらの2つのメソッドを実装するのだ touchesBegan:withEvent:touchesEnded:withEventtouch上で派手なアニメーションを処理します。ただし、セルのタッチを親に通知するために[super touchesBegan:touches withEvent:event];メソッドad を追加することを忘れていました[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
}

1
これにより、特にOPの問題が発生したことが確認できます
Josh Wolff

4

私の場合、解決策は以下の関数でNOをYESに変更することでした。

iOS 9以降

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

これも私の問題でした。複数のtableViewの実装があり、このメソッドで2つのtableViewを分離するのを忘れていました。
チューリングテスト済み
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.