Saya telah menulis fungsi saya sendiri untuk menggulir bidang teks saat papan ketik muncul. Untuk menghapus keyboard dengan mengetuk menjauh dari bidang teks, saya telah membuat UITapGestureRecognizer
yang menangani pengunduran diri responden pertama pada bidang teks saat mengetuk pergi.
Sekarang saya juga telah membuat pelengkapan otomatis untuk bidang teks yang membuat UITableView
tepat di bawah bidang teks dan mengisinya dengan item saat pengguna memasukkan teks.
Namun, ketika memilih salah satu entri dalam tabel yang dilengkapi otomatis, didSelectRowAtIndexPath
tidak dipanggil. Alih-alih, tampaknya pengenal gerakan ketuk dipanggil dan baru saja mengundurkan diri dari responden pertama.
Saya menduga ada beberapa cara untuk memberi tahu pengenal gerakan ketuk untuk terus meneruskan pesan ketuk ke bawah UITableView
, tapi saya tidak tahu apa itu. Bantuan apapun akan sangat dihargai.
Jawaban:
Ok, akhirnya menemukannya setelah beberapa pencarian melalui dokumen pengenal isyarat.
Solusinya adalah mengimplementasikan
UIGestureRecognizerDelegate
dan menambahkan yang berikut:Itu merawatnya. Semoga ini akan membantu orang lain juga.
sumber
return ![touch.view isKindOfClass:[UITableViewCell class]];
![touch.view isEqual: self.tableView] &&
sebelum[touch.view isDescendantOfView: self.tableView]
untuk mengecualikantableView
sendiri (karenaisDescendantOfView:
juga kembaliYES
jika argumen-view adalah penerima-view itu sendiri). Harapan itu membantu orang lain yang menginginkan hasil yang sama.Cara termudah untuk menyelesaikan masalah ini adalah dengan:
Ini memungkinkan
UIGestureRecognizer
mengenali ketukan dan juga meneruskan sentuhan ke responden berikutnya. Konsekuensi yang tidak diinginkan dari metode ini adalah jika Anda memilikiUITableViewCell
layar yang mendorong pengontrol tampilan lain. Jika pengguna mengetuk baris untuk mengabaikan keyboard, baik keyboard dan push akan dikenali. Saya ragu ini yang Anda maksudkan, tetapi metode ini memadai untuk banyak situasi.Selain itu, memperluas jawaban Robert, jika Anda memiliki pointer ke tampilan tabel yang dimaksud, maka Anda dapat langsung membandingkan kelasnya daripada harus mengkonversi ke string dan berharap Apple tidak mengubah nomenklatur:
Ingat, Anda juga harus menyatakan
UIGestureRecognizer
memiliki delegasi dengan kode ini di dalamnya.sumber
isDescendantOfView
alih-alih hanya memeriksa apakahclass
sama, karena Anda mungkin mengetuk subview. Tergantung pada apa yang Anda butuhkan.Set
cancelsTouchesInView
pengenal Anda ke false. Kalau tidak, itu "mengkonsumsi" sentuhan untuk dirinya sendiri, dan tidak meneruskannya ke tampilan tabel. Itu sebabnya acara seleksi tidak pernah terjadi.misalnya dalam
swift
sumber
Dan untuk Swift (berdasarkan jawaban dari @Jason):
sumber
Saya mungkin memiliki solusi yang lebih baik untuk menambahkan gerakan tap pada tampilan tabel tetapi memungkinkan pemilihan sel pada saat yang sama:
Saya hanya mencari sel di titik layar di mana pengguna mengetuk. Jika tidak ada jalur indeks yang ditemukan maka saya membiarkan gerakan menerima sentuhan jika tidak saya membatalkannya. Bagi saya ini sangat bagus.
sumber
Saya pikir tidak perlu untuk menulis blok kode hanya cukup diatur
cancelsTouchesInView
untukfalse
untuk objek sikap Anda, secara default itutrue
dan Anda hanya perlu mengaturnyafalse
. Jika Anda menggunakanUITapGesture
objek dalam kode Anda dan juga menggunakanUIScrollView
(tableview, collectionview) maka atur properti inifalse
sumber
Solusi serupa adalah menerapkan
gestureRecognizer:shouldReceiveTouch:
menggunakan kelas view untuk menentukan tindakan apa yang harus diambil. Pendekatan ini memiliki keuntungan tidak menutupi tap di wilayah yang mengelilingi tabel secara langsung (tampilan area ini masih diturunkan dari instance UITableView, tetapi tidak mewakili sel).Ini juga memiliki bonus yang berfungsi dengan beberapa tabel pada satu tampilan (tanpa menambahkan kode tambahan).
Peringatan: ada asumsi bahwa Apple tidak akan mengubah nama kelas.
sumber
return ![[touch.view.superview class] isSubclassOfClass:[UITableViewCell class]];
Untuk Swift 4.2 solusinya adalah mengimplementasikan
UIGestureRecognizerDelegate
dan menambahkan yang berikut:ketika Anda mengklik pada tampilan tabel, metode delegasi ini mengembalikan false dan
didSelectRowAtIndexPath
metode tampilan tabel bekerja dengan benar.sumber
Saya memiliki situasi yang berbeda di mana saya ingin fungsi gesture sentuh dipanggil hanya ketika pengguna mengetuk di luar tampilan tabel. Jika pengguna mengetuk di dalam tampilan tabel, maka fungsi gerakan sentuh tidak boleh dipanggil. Selain itu, Jika fungsi gerakan sentuh disebut, fungsi sentuh tetap harus melewati tampilan yang disadap alih-alih mengonsumsinya.
Kode yang dihasilkan adalah kombinasi dari jawaban Abdulrahman Masoud, dan jawaban Nikolaj Nielsen.
Dan di
MyViewController
kelas, kelas yang memilikiUITableView
, dionViewDidLoad()
, saya memastikan untuk memanggiladdGestureRecognizer()
:sumber
Hanya mengatur
cancels touches in view
untukfalse
untuk setiap gerakan di bawah(table/collection)View
:- Interfacebuilder
- Kode
sumber
Meskipun sudah terlambat dan banyak orang menemukan bahwa saran di atas berfungsi dengan baik, saya tidak bisa mendapatkan metode Jason atau TMilligan untuk bekerja.
Saya memiliki TableView statis dengan beberapa sel yang berisi textFields yang menerima input Angka hanya menggunakan Keyboard Angka. Ini ideal untuk saya:
Pastikan Anda telah menerapkan ini
<UIGestureRecognizerDelegate>
dalam file .h Anda.Baris ini
![touch.view isKindOfClass:[UITableViewCell class]]
memeriksa apakah tableViewCell disadap dan mengabaikan keyboard aktif apa pun.sumber
Solusi sederhana menggunakan contoh UIControl di UITableViewCell untuk mendapatkan sentuhan. Anda dapat menambahkan tampilan apa pun dengan userInteractionEnables == NO ke UIControl untuk mendapatkan ketukan.
sumber
Ini adalah solusi saya, yang menghubungkan shouldReceiveTouch langsung dari pengenal untuk melihat apakah keyboard ditampilkan.
Dalam delegasi pengenal isyarat keran Anda:
Dan
PFXKeyboardStateListener.h
:Dan
PFXKeyboardStateListener.m
:Anda mungkin ingin memperbarui pola tunggal pendengar keyboard, saya belum mendapatkannya. Semoga ini berhasil untuk semua orang dan juga untuk saya. ^^
sumber
Terapkan metode ini untuk mendelegasikan UIGestureRecognizer:
sumber
Dengan cepat Anda dapat menggunakan ini di dalam
sumber
Kasus saya berbeda termasuk uisearchbar dan uitableview on self.view. Saya ingin mengabaikan keyboard uisearchbar dengan menyentuh tampilan.
Pada Metode Delegasi UISearchBar:
Saat pengguna menyentuh pada self.view:
sumber
Swift 5, Mei 2020.
Saya memiliki textField dan tableView yang menjadi terlihat ketika saya memasukkan teks.
Keadaan awal Jadi saya ingin 2 acara berbeda ketika saya mengetuk tableViewCell atau yang lainnya.
Keyboard dan tableView sedang ditampilkan
Pertama-tama kita menambahkan tapGestureRecognizer.
Kemudian kita tambahkan cek berikut ke dalam UIGestureRecognizerDelegate:
}
Jika saya ingin menyembunyikan keyboard terlebih dahulu, tableView tetap terlihat dan responsif terhadap ketukan saya.
masukkan deskripsi gambar di sini
sumber
Ini solusi saya berdasarkan jawaban di atas ... Ini berhasil untuk saya ...
sumber
MASALAH: Dalam kasus saya, masalahnya adalah bahwa saya awalnya menempatkan tombol di setiap sel collectionView dan mengatur batasan untuk mengisi sel, sehingga ketika sel diklik akan mengklik tombol, namun fungsi tombol kosong sehingga tidak ada yang tampaknya terjadi.
FIX: Saya memperbaiki ini dengan menghapus tombol dari sel tampilan koleksi.
sumber