Saya sedang menulis aplikasi iOS dengan tampilan tabel di dalam tampilan tab. Di saya UITableViewController
, saya menerapkan -tableView:didSelectRowAtIndexPath:
, tetapi ketika saya memilih baris saat runtime, metode tidak dipanggil. Tampilan tabel sedang diisi, jadi saya tahu bahwa metode tableView lain di controller saya dipanggil.
Adakah yang tahu apa yang mungkin saya lakukan untuk mewujudkannya?
ios
uitableview
cocoa-touch
didselectrowatindexpath
Matt Pfefferle
sumber
sumber
UITableView
?-didSelectRowAtIndexPath
. Saya tahu topi karena saya memiliki pengenal gerakan ketukan di tampilan meja dan gerakan harus gagal terlebih dahulu sebelum menerima sentuhan. Meskipun aneh, animasi pemilihan tabel tidak terpengaruh oleh pengenal isyarat.Jawaban:
Kedengarannya mungkin kelas bukan
UITableViewDelegate
untuk tampilan tabel itu, meskipunUITableViewController
seharusnya diatur secara otomatis.Adakah peluang Anda mereset delegasi ke kelas lain?
sumber
Untuk berjaga-jaga seandainya seseorang melakukan kesalahan bodoh yang sama seperti yang saya lakukan:
Periksa apakah nama metode yang Anda harapkan
didSelect
mungkin secara tidak sengaja diperolehdidDeselect
dengan cara tertentu. Butuh sekitar dua jam bagi saya untuk mencari tahu ...sumber
Hal lain yang mungkin menyebabkan masalah adalah jenis pemilihan yang tidak dipilih:
Harus
Single Selection
untuk seleksi normal, seharusnya tidak menjadiNo Selection
.Untuk melakukan ini secara pemrograman, lakukan:
sumber
Kemungkinan lain adalah bahwa UITapGestureRecognizer dapat memakan acara tersebut, seperti yang terjadi di sini: https://stackoverflow.com/a/9248827/214070
Saya tidak curiga penyebab ini, karena sel-sel tabel masih akan menyorot biru seolah-olah keran berhasil.
sumber
didSelectRowAtIndexPath
tidak hanya berfungsi setelah menghapus sel dicommitEditingStyle
. Lalu saya membuatUITapGestureRecognizer
dan ditapAction:
dapatkanindexPath
darisender.view
([self.tableView indexPathForCell:sender.view]
) dan menelepon[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Semua jawaban bagus, tapi ada satu lagi yang harus diperhatikan ...
(Khususnya saat membuat UITableView secara terprogram)
Pastikan tableView dapat merespons seleksi dengan mengatur
[tableView setAllowsSelection:YES];
atau menghapus baris apa pun yang mengaturnyaNO
.sumber
setAllowsSelectionDuringEditing:
ke daftar (ketika tableview dalam mode editing)Single Selection
.Jika masalah muncul dengan
UITapGestureRecognizer
Anda dapat memperbaiki ini:dalam kode dengan
Objective-C
:dalam kode dengan
Swift
:sumber
Saya telah menemukan dua hal dalam situasi ini.
Anda mungkin lupa mengimplementasikan protokol UITableViewDelegate, atau tidak ada outlet delegasi antara kelas Anda dan tampilan tabel Anda.
Anda mungkin memiliki UIView di dalam baris Anda yang merupakan responden pertama dan menghilangkan klik Anda. Ucapkan UIButton atau yang serupa.
sumber
Saya memiliki masalah yang sama. Dan itu sulit ditemukan. Tetapi di suatu tempat dalam kode saya adalah ini:
Pasti
return indexPath
, kalau-tableView:didSelectRowAtIndexPath:
tidak, tidak akan dipanggil.sumber
Jika Anda menambahkan gestureRecognizer di atas UITableView,
didSelectRowAtIndexPath
tidak akan dipanggil.Jadi, Anda perlu menggunakan metode delegasi gestureRecognizer untuk menghindari sentuhan dalam tampilan tertentu.
sumber
if ([touch.view isDescendantOfView:YourTable])
Saya mengalami masalah di mana setelah berbulan-bulan tidak melihat kode saya, saya lupa bahwa saya menerapkan metode berikut karena beberapa persyaratan yang tidak perlu
Itu harus mengembalikan YA untuk satu baris untuk membuatnya dipilih.
sumber
ANDA HARUS memilih opsi ini
tetapi jika Anda ingin membuat
UITableView
tidak disorot pada mengklik maka Anda harus membuat perubahan padaUITableViewCell
properti.Pilih opsi Tidak Ada untuk Seleksi seperti di bawah ini
sumber
Saya telah meletakkan
UITapGestureRecognizer
pada tampilan meja saya untuk menghilangkan keyboard yang mencegahdidSelectRowAtIndexPath:
dipanggil. Semoga ini bisa membantu seseorang.sumber
Jika Anda memiliki masalah yang sama dengan saya: Rupanya, metode ini tidak akan dipanggil jika tableView Anda dalam mode edit. Anda harus mengatur allowSelectionDuringEditing menjadi true.
Melalui pertanyaan ini: Saat mengedit, `UITableView` tidak memanggil didSelectRowAtIndexPath ??
sumber
Saya memiliki masalah yang sama,
Alasannya menggunakan
UITapGestureRecognizer
. Saya ingin keyboard untuk menutup ketika saya mengetuk tempat lain. Saya menyadari bahwa ini mengesampingkan semua tindakan tap, itu sebabnya,didSelectRowAtIndexPath
fungsi tidak dipanggil.Ketika saya mengomentari baris terkait
UITapGestureRecognizer
, itu berfungsi. Selain itu Anda dapat memeriksa fungsiUITapGestureRecognizer selector
apakah mengetukUITableViewCell
atau tidak.sumber
Dalam kasus saya, didSelctRowAtIndexPath tidak menelepon adalah karena bahwa saya telah memilih tidak dalam Pemilihan milik tableView, set untuk seleksi tunggal memecahkan masalah saya
sumber
Untuk Xcode 6.4, Swift 1.2. "Tag" pilihan telah diubah dalam IB. Saya tidak tahu bagaimana dan mengapa. Mengaturnya ke "Pilihan Tunggal" membuat sel tampilan tabel saya dipilih kembali.
sumber
Meskipun jawaban lain telah diterima, saya akan menambahkan satu lagi kemungkinan masalah dan solusi untuk orang yang mengamati masalah ini:
Jika Anda memiliki penghitungan referensi otomatis (ARC) dihidupkan, Anda mungkin menemukan bahwa bahkan setelah menetapkan controller Anda sebagai delegasi tampilan, pesan tampilan ke controller tidak diterima karena ARC menghapus controller. Rupanya pointer delegasi UITableView tidak dihitung sebagai referensi untuk ARC, jadi jika itu adalah satu-satunya referensi untuk itu, controller akan dealloc'd. Anda dapat memverifikasi apakah ini terjadi atau tidak dengan menerapkan metode dealloc pada controller dan mengatur breakpoint atau panggilan NSLog di sana.
Solusinya adalah melacak controller dengan referensi yang kuat di tempat lain, sampai Anda yakin Anda tidak akan membutuhkannya lagi.
sumber
Ingatlah untuk mengatur sumber data dan mendelegasikan dalam metode viewDidLoad sebagai berikut:
sumber
Masalah saya tidak ada di atas. Dan sangat timpang. Tapi saya pikir saya akan mendaftar di sini kalau-kalau itu membantu seseorang.
Saya memiliki
tableViewController
controller "basis" saya dan kemudian saya membuat subkelas dari kontroler ini. Saya sedang menulis semua kode saya ditableView:didSelectRowAtIndexPath
rutin di kelas "base". Benar-benar lupa bahwa secara default rutin ini juga telah dibuat (walaupun tanpa kode yang melakukan apa pun) di semua subkelas saya juga. Jadi ketika saya menjalankan aplikasi saya, ia menjalankan kode versi subkelas, tidak melakukan apa-apa, dan membuat saya sedih. Jadi tentu saja, setelah saya menghapus rutin dari subclass, itu menggunakan rutinitas kelas "dasar" dan saya dalam bisnis.Aku tahu. Jangan tertawa. Tapi mungkin ini akan menyelamatkan seseorang saat aku kehilangan ...
sumber
Memberi 2 sen saya untuk ini.
Saya memiliki Custom UITableViewCell dan ada tombol yang menutupi seluruh sel, jadi ketika sentuhan terjadi, tombol itu dipilih dan bukan sel.
Baik menghapus tombol atau dalam kasus saya, saya mengatur Interaksi Pengguna Aktif ke salah pada tombol, dengan cara sel yang dipilih.
sumber
Jika Anda membaca ini, jadi masih tidak menyelesaikan masalah.
Saya memiliki sel khusus , tempat kotak centang " Interaksi Pengguna Diaktifkan " dinonaktifkan. Jadi, saya aktifkan saja. Semoga berhasil.
sumber
Saya baru saja mengalami ini dan seperti yang terjadi pada saya di masa lalu itu tidak berhasil karena saya tidak memperhatikan autocomplete ketika mencoba menambahkan metode dan saya benar-benar akhirnya menerapkan
tableView:didDeselectRowAtIndexPath
: alih-alihtableView:didSelectRowAtIndexPath:
.sumber
Pastikan Anda diimplementasikan
tableView:didSelectRowAtIndexPath
dan tidaktableView:didDeSelectRowAtIndexPath
Ini membuat saya lebih dari beberapa kali !!
sumber
Saya tahu sudah tua dan masalahnya telah teratasi, tetapi memiliki masalah yang serupa, saya pikir masalahnya ada pada UITableViewCell kustom saya, tetapi solusinya benar-benar berbeda - saya me-restart XCode :) dan kemudian berfungsi dengan baik! hampir seperti Windows :)
sumber
Jika tampilan tabel Anda dalam mode edit (mis.
[tableView setEditing:YES animated:NO];
), Anda perlu mengaturtableView.allowsSelectionDuringEditing = YES;
sumber
Kesalahan lain yang bisa Anda lakukan (seperti yang saya lakukan): jika Anda menetapkan segue di sel,
didSelectRowAtIndexPath
tidak dipanggil. Anda harus mengatur segues Anda di pengontrol tampilan.sumber
Tidak satu pun dari jawaban ini yang berhasil untuk saya. Setelah sekitar satu jam, saya menemukan sesuatu yang sangat berbahaya:
Saya memiliki tampilan tabel di dalam sel tampilan tabel lain. Saya memutuskan untuk membuat tampilan terlampir yang berisi tampilan tabel bagian dalam, antara lain. Saya memanggil viewView ini dan menghubungkannya di xib.
Ternyata UITableViewCell sudah memiliki contentView dan melakukan hal-hal aneh dengannya. Masalah ini teratasi dengan sendirinya ketika saya mengubah nama properti menjadi mainContentView dan menghubungkan kembali tampilan ke properti yang diganti nama ini.
sumber
Dalam kasus saya, saya secara dinamis menghitung ketinggian
TableView
'sSuperView
pada saat beban. Karena kesalahan perhitungan,TableView
diposisikan di luarSuperView
. ItuTableView
ditarik baik-baik saja, namun semua interaksi dinonaktifkan (dandidSelectRowAtIndexPath
tidak pernah dipanggil). Sangat sulit dideteksi, karena tidak ada indikasi visual yangTableView
tidak dapat "diakses".sumber
Dalam kasus saya masalahnya adalah saya memiliki
UITableViewCell
subkelas dan saya telah menerapkan dua metode ini:touchesBegan:withEvent:
&touchesEnded:withEvent
untuk menangani animasi mewah saat disentuh. Tapi saya lupa menambahkan[super touchesBegan:touches withEvent:event];
metode iklan[super touchesEnded:touches withEvent:event];
untuk juga memberi tahu sel induk tentang sentuhan.Jadi mengubah kode ke berikut memecahkan masalah saya:
sumber
Dalam kasus saya, solusinya adalah mengubah TIDAK menjadi YA dalam fungsi di bawah ini.
iOS 9+
sumber