UITableView didSelectRowAtIndexPath: tidak dipanggil pada ketukan pertama

352

Saya mengalami masalah dengan UITableView's didSelectRowAtIndexPath.

Meja saya sudah diatur sehingga ketika saya memilih baris itu menginisialisasi pengontrol tampilan baru dan mendorongnya.

Pertama kali saya mengetuk baris apa pun di tabel, metode ini tidak dipanggil. Setelah saya memilih baris lain, itu mulai berfungsi seperti biasa.

Saya telah memverifikasi ini dengan menetapkan breakpoint pada didSelectRowAtIndexPath. Ketika menambahkan NSLogmetode saya melihat bahwa ketika saya memilih baris kedua yang akhirnya mendorong controller tampilan baru, saya melihat dua pernyataan log muncul di konsol pada saat yang sama.

Ada saran?

Mark Adams
sumber
2
Bisakah Anda memposting kode untuk tableView:didSelectRowAtIndexPath:?
gerry3
Saya memiliki masalah yang sama, periksa jawaban saya: stackoverflow.com/a/44097559/1600061
Zsivics Sanel
1
Pengiriman dalam antrian utama menyelesaikan masalah saya stackoverflow.com/questions/20149167/…
durgeshtrivedi

Jawaban:

1356

Kesempatan apa pun yang Anda ketik tidak sengaja lakukan De selectRowAtIndexPath?

Ole Begemann
sumber
17
@ Dschee itu tidak dipanggil pada ketukan pertama karena Anda tidak membatalkan pilihan apa pun. Setelah Anda memilih satu baris, ketika Anda mencoba untuk memilih yang kedua, yang pertama akan terpilih.
Bung
19
Itu sebabnya saya MENYUKAINYA.
elbuild
4
Saya membatalkan ini bukan karena saya telah membuat kesalahan ini sekali. Saya menang karena saya telah membuat kesalahan ini tidak kurang dari 4 kali hanya dalam beberapa tahun, menghabiskan banyak waktu.
Brooks Hanes
8
OH TUHAN!! Ini mungkin bug terburuk yang saya perkenalkan dalam kode saya.
Shantanu Paul
4
WOW. Menghemat banyak waktu.
MortalMan
24

Periksa juga properti pemilihan tampilan tabel Anda dalam file xib. Gunakan 'Seleksi Tunggal' atau 'Seleksi Berganda' sebagaimana diperlukan.

termasuk saya
sumber
2
Ba ha ha ha! Wow, saya menghabiskan 4 jam untuk mencari tahu. @includeMe to the rescue (salut)! Terima kasih!
17

Saya mengalami masalah berikut:

  • ketuk pertama di baris -> tidak ada efek, tidak ada pilihan, tidak pernah
  • ketuk kedua dan ikuti -> perilaku pemilihan yang benar, selalu

Dalam kasus saya, kesalahan saya sedang memeriksa Show Selection on Touchdi Interface Builder. Anda dapat menghapus centang di IB di sini:

masukkan deskripsi gambar di sini

Semoga itu bisa membantu seseorang

sonxurxo
sumber
Kamu adalah pahlawanku! Adakah yang tahu mengapa ini default? Saya tidak bisa memikirkan aplikasi apa pun yang memiliki perilaku itu dan saya pikir ini adalah standar yang sangat aneh.
Christophe Fondacci
12

Periksa Jika Anda telah menetapkan pengenal gerakan di kelas Anda. Menghilangkan gestur berhasil untuk saya.

Penggemar YSR
sumber
Saya punya keduanya; Pengenal gerakan dan didSelectRowAtIndexPath? Namun, selalu pengenal isyarat mengambil preferensi. Tidak dapat membuka yang kedua. Apakah ada cara untuk menangani keduanya atau apakah saya harus menyingkirkan pengenal isyarat? Terima kasih!
Ron
ini pasti di atas :) harganya 1 jam setelah 7 tahun dalam pengembangan iOS.
Badut
6

Saya berdebat bahkan memposting jawaban ini karena saya pikir bintang-bintang agak selaras untuk mewujudkannya.

Saya mengalami variasi masalah ini dan telah memeriksa solusi lain. Pada tampilan meja saya itu tidak memproses baris terakhir dari meja saya pada ketukan pertama. Itu menyoroti itu, tetapi didSelectRowAtIndexPathtidak dipanggil. Semua baris lainnya berfungsi dengan baik. Tetapi jika saya mengaktifkan bouncing tableview maka sepertinya akan menyelesaikan masalah (tapi kemudian Anda harus berurusan dengan bouncing tableview).

Chase Roberts
sumber
Apakah Anda menemukan alasan mengapa ini terjadi? Saya memiliki masalah yang persis sama. Ketika saya mematikan meja memantul, maka baris pertama / terakhir dalam tabel tidak bereaksi pada ketukan pertama. Saya pikir ini bug tetapi sudah lebih dari satu tahun dan masih terjadi.
filip.karas
Tidak. Aku hanya menyalakan pantulan meja dan membiarkannya seperti itu.
Chase Roberts
Saya mengalami masalah ini hanya pada iPhone 5 (iOS 10.3) - mengaktifkan bouncing ON pada tampilan tabel saya memperbaikinya. Sangat aneh!
Lee Probert
4

UITableViewCellSelectionStyleNone ditetapkan untuk sel yang menampilkan masalah itu (ios9).

Saya akhirnya menelepon

[tableView deselectRowAtIndexPath:indexPath animated:NO];

hal pertama di

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

yang tidak sama, tetapi cukup baik. membuat saya bertanya-tanya seperti apa kerusakan meja yang dibawa ios10.

Anton Tropashko
sumber
Ini bekerja untuk saya, tetapi saya perlu solusi untuk menyembunyikan pilihan tanpa membuat gayanya Tidak ada. Saya melakukan override setSelectedtetapi saat pengguna memegang sel, muncul pilihan yang tidak dapat diterima
MMujtabaRoohani
1

SWIFT 2

Pastikan Anda memiliki set ini menjadi true:

self.tableView.allowsSelection = true

Letakkan ini di atas kanan Anda setelah Anda viewDidLoad()dan sebelumsuper.viewDidLoad()

Lukesivi
sumber
1

SWIFT 3

Jika Anda bekerja dengan Swift 3 di kelas yang bukan UITableViewControllerdan Anda gunakan UITableViewDelegate, maka Anda mungkin perlu menggunakan judul metode:

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

Ini bekerja untuk saya, walaupun saya baru saja memigrasikan proyek saya ke Swift 3. Ini cukup baru sehingga ini mungkin diperbaiki nanti.

Adam Smith
sumber
1

Jika Anda telah menetapkan UITapGestureRecognizer di kelas Anda, Anda dapat menambahkan baris ini di didSelectRowAtIndexPath Anda:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

Ini berhasil untuk saya.

garridozh
sumber
1

masalah ini terjadi juga ketika Anda bekerja dengan pengenal isyarat dalam tableView dalam hal ini Anda tidak perlu menghapusnya, Anda hanya perlu memastikan bahwa properti isyarat Anda cancelsTouchesInView = falseini adalah nilai boolean yang memengaruhi apakah sentuhan dikirim ke tampilan saat suatu gerakan dikenali.

Ayoub Nouri
sumber
0

SWIFT 3

Tidak ada jawaban lain yang berhasil dalam kasus saya, yang memperbaikinya bagi saya adalah:

tableView.delaysContentTouches = false

Diogo Martins
sumber
0

didSelectRowAtfungsi tidak dipanggil dalam aplikasi saya di ketukan pertama atau kedua ... Saya sedang mencoba menyelesaikan masalah tidak dapat menemukan solusi. Tapi tiba-tiba saya dikenali, saya menggunakan view.animation change color ... Delegatemetode tidak dipanggil saat animasi tetap ada

Beyaz
sumber
0

Dalam kasus saya, saya memiliki header bagian UITableView dengan pengenal isyarat. Ketika header diketuk, itu harus memasukkan beberapa baris ke bagian itu dan menghidupkan animasi (seperti memperluas / menutup bagian). Pertama kali ketika diperluas dan disadap, metode delegasi didSelectRow tidak dipecat. Untuk mengetuk lebih lanjut dan memperluas / menutup tindakan, itu berfungsi seperti yang diharapkan.

Per jawaban oleh @Ayoub Nouri Saya mengatur cancelsTouchesInView ke false, dan ini menyelesaikan masalah. tapGestureRecognizer? .cancelsTouchesInView = false

Kabeer
sumber
0

Cepat 4.2

Menonaktifkan "Delay Touch Down" di inspektur atribut menyelesaikan masalah.
Setelah itu kliknya lancar dan didSelectRowAt langsung menyala.

Atribut atribut XCode

Aviv Mor
sumber
0

Apa yang berhasil bagi saya adalah mulai mengetik "didSelect ..." dan kemudian biarkan koreksi otomatis mengisi sisanya. Rupanya beberapa detail sintaksis saya miring. Seperti yang orang lain katakan, Gunakan IDE !!

safari kuning
sumber