UITableView didSelectRowAtIndexPath:最初のタップで呼び出されない


352

私は問題を抱えています UITableView's didSelectRowAtIndexPathます。

テーブルは、行を選択すると新しいビューコントローラを初期化してプッシュするように設定されています。

テーブルの任意の行を初めてタップしたときに、メソッドが呼び出されません。別の行を選択すると、通常どおりに機能し始めます。

にブレークポイントを設定してこれを確認しましたdidSelectRowAtIndexPath。追加するときNSLogメソッドにをと、最終的に新しいビューコントローラーをプッシュする2番目の行を選択すると、コンソールに2つのログステートメントが同時に表示されることがわかります。

助言がありますか?


2
コードを投稿できますtableView:didSelectRowAtIndexPath:か?
gerry3

私は同じ問題を抱えていました、私の答えを確認してください:stackoverflow.com/a/44097559/1600061
Zsivics Sanel

1
メインキューでの発送は私の問題の解決stackoverflow.com/questions/20149167/...
durgeshtrivedi

回答:


1356

誤って入力した可能性がありますか?De selectRowAtIndexPath?


17
@Dschee何も選択解除していないので、最初のタップでは呼び出されません。1つの行を選択した後、2番目の行を選択しようとすると、最初の行の選択が解除されます。

19
だから私はとても大好きです。
elbuild 2015年

4
私は一度この間違いをしたのではなく、これに賛成しました。私はこのミスを何年にもわたって4回も行ったので、多くの時間を費やして賛成票を投じました。
Brooks Hanes、2015

8
ああ、神様!!これは、コードで紹介した最悪のバグの可能性があります。
Shantanu Paul

4
ワオ。時間を大幅に節約できました。
MortalMan、2015

24

また、xibファイルでテーブルビューの選択プロパティを確認してください。必要に応じて「単一選択」または「複数選択」を使用します。


2
バハハハ!わあ、4時間かけてこれを理解しようとしました。@includeMeを助けて(敬礼)!ありがとう!

17

次の問題が発生しました:

  • 行の最初のタップ->効果なし、選択なし、 決してなし
  • 2回目のタップとそれに続く->正しい選択動作、常に

私の場合、エラーはShow Selection on TouchInterface Builderでのチェックでした。ここのIBでチェックを外すことができます:

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

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


あなたは私のヒーローです!これがデフォルトである理由は何ですか?そのような動作をするアプリはありません。これは非常に奇妙なデフォルトだと思います。
Christophe Fondacci

12

クラスにジェスチャー認識機能を設定しているかどうかを確認します。ジェスチャーを削除するとうまくいきました。


私は両方持っています。ジェスチャー認識機能とdidSelectRowAtIndexPath?ただし、常にジェスチャー認識機能が優先されます。2番目に到達できません。両方を処理する方法はありますか、それともジェスチャー認識機能を取り除く必要がありますか?ありがとう!
Ron

これは一番上にあるに違いありません:) iOS開発の7年後、1時間かかりました。
ピエロ

6

私はこの答えを投稿することについてさえ議論しました。なぜなら、これが現れるために星は一種の整列をしていると思うからです。

この問題のバリエーションがあり、他の解決策を確認しました。テーブルビューでは、最初のタップでテーブルの最後の行が処理されていません。それを強調表示しますが、didSelectRowAtIndexPath呼び出されていません。他のすべての行は正常に動作します。しかし、テーブルビューのバウンスをオンにすると、問題が解決するようです(ただし、テーブルビューのバウンスに対処する必要があります)。


これが起こっている理由を見つけましたか?私はまったく同じ問題を抱えています。テーブルのバウンスをオフにすると、テーブルの最初/最後の行が最初のタップで反応しません。バグだと思っていましたが、1年以上経っています。
filip.karas

いいえ、テーブルビューのバウンスをオンにしてそのままにしておきました。
チェイスロバーツ

この問題はiPhone 5のみ(iOS 10.3)で発生しています-テーブルビューでバウンスをオンにすると問題が解決しました。非常に奇妙な!
Lee Probert

4

問題を表示するセル(ios9)にUITableViewCellSelectionStyleNoneが設定されました。

私は電話をしてしまった

[tableView deselectRowAtIndexPath:indexPath animated:NO];

最初に

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

同じではありませんが、十分です。ios10がどんな種類のテーブル破損をもたらすのか不思議に思います。


これは私にとってはうまくいきましたが、スタイルをNoneにせずに選択範囲を隠すための回避策が必要です。オーバーライドしましたsetSelectedが、ユーザーがセルを保持しているときに選択が表示され、これは受け入れられません
MMujtabaRoohani 2017

1

SWIFT 2

これがtrueに設定されていることを確認してください:

self.tableView.allowsSelection = true

あなたの後にあなたの権利の上にこれを入れてviewDidLoad()と前super.viewDidLoad()


1

SWIFT 3

あなたがいないクラスでスウィフト3で作業している場合はUITableViewController、あなたが使用しているUITableViewDelegate、あなたはメソッドのタイトルを使用する必要があります。

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

プロジェクトはSwift 3に移行したばかりですが、これでうまくいきました。かなり新しいので、後で修正される可能性があります。


1

クラスにUITapGestureRecognizerを設定している場合は、didSelectRowAtIndexPathに次の行を追加できます。

[tableView deselectRowAtIndexPath:indexPath animated:NO];

これでうまくいきました。


1

この問題は、tableView内でジェスチャー認識機能を使用している場合にも発生します。この場合、ジェスチャー認識機能を削除する必要はありません。ジェスチャープロパティcancelsTouchesInView = falseが、タッチがビューに配信されるかどうかに影響するブール値であることを確認する必要があるだけです。ジェスチャーが認識されます。



0

didSelectRowAtアプリで最初または2回目のタップで関数が呼び出されませんでした...問題を解決しようとしていましたが、解決策が見つかりませんでした。しかし、突然、私は認識しました。view.animationcolor change ...を使用していました... Delegateアニメーションが持続している間にメソッドが呼び出されませんでした


0

私の場合、ジェスチャ認識機能を備えたUITableViewセクションヘッダーがありました。ヘッダーがタップされると、そのセクションに数行が挿入され、挿入がアニメーション化されます(セクションの展開/折りたたみなど)。初めて展開してタップしたとき、didSelectRowデリゲートメソッドは起動されませんでした。それ以上のタップおよび展開/折りたたみアクションについては、期待どおりに機能していました。

@Ayoub Nouriの回答ごとに、cancelsTouchesInViewをfalseに設定して、問題を解決しました。tapGestureRecognizer?.cancelsTouchesInView = false


0

Swift 4.2

属性インスペクターで「遅延タッチダウン」を無効にすると、問題が解決しました。
その後、クリックはスムーズになり、didSelectRowAtがすぐに発生します。

XCode属性インスペクター


0

私にとってうまくいったのは、「didSelect ...」と入力し始めて、残りをオートコレクトに入力させることでした。どうやら私の構文のいくつかの詳細は不安定でした。他の人が言ったように、IDEを使用してください!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.