Saya memiliki UITableView
dengan UITextField
s sebagai sel. Saya ingin menutup keyboard saat latar belakang UITableView
disentuh. Saya mencoba melakukan ini dengan membuat UIButton
ukuran UITableView
dan menempatkannya di belakang UITableView
. Satu-satunya masalah adalah UIButton
menangkap semua sentuhan bahkan ketika sentuhan itu ada di UITableView. Apa yang saya lakukan salah?
Terima kasih!
ios
uitableview
uikeyboard
Hua-Ying
sumber
sumber
Jawaban:
Hal ini mudah dilakukan dengan membuat objek UITapGestureRecognizer (secara default ini akan mendeteksi "isyarat" pada satu ketukan sehingga tidak diperlukan penyesuaian lebih lanjut), menentukan target / tindakan saat isyarat diaktifkan, lalu melampirkan objek pengenal isyarat ke tampilan tabel Anda.
Misalnya Mungkin dalam
viewDidLoad
metode Anda :Dan
hideKeyboard
metodenya mungkin terlihat seperti ini:Perhatikan bahwa gerakan tidak ditembakkan saat menyentuh di dalam suatu
UITextField
objek. Itu diaktifkan meskipun diUITableView
latar belakang, tampilan footer, tampilan header dan diUILabels
dalam sel dll.sumber
gestureRecognizer.cancelsTouchesInView = NO;
hideKeyboard
metodenya, alih-alih berkomunikasi langsung dengan kolom teks yang bisa Anda lakukan[self.view endEditing:NO];
. Dari dokumen Apple: " Metode ini melihat tampilan saat ini dan hierarki subview untuk bidang teks yang saat ini menjadi responden pertama. Jika menemukannya, metode ini akan meminta bidang teks tersebut untuk mengundurkan diri sebagai responden pertama. Jika parameter gaya disetel ke YA, bidang teks bahkan tidak pernah diminta; itu dipaksa untuk mengundurkan diri. "Solusi UITapGestureRecognizer berfungsi dengan pemilihan sel tabel jika Anda menyetel:
sumber
shouldReceiveTouch
Inilah cara terbaik untuk melakukannya. Lakukan saja ini
atau
sumber
Anda juga dapat melakukannya dari Storyboard:
sumber
Seperti
UITableView
subkelas dariUIScrollView
, mengimplementasikan satu metode delegasi di bawah ini memberikan solusi yang sangat mudah dan cepat. Bahkan tidak perlu terlibatresignFirstResponder
karena hierarki tampilan melakukan introspeksi dan menemukan responden saat ini dan memintanya untuk mengundurkan diri dari status penjawabnya.Dan ingat untuk menambahkan
UIScrollViewDelegate
ke file header.sumber
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
Pertama, dengarkan
scrollViewWillBeginDragging
di AndaUIViewController
dengan menambahkanUIScrollViewDelegate
:Dalam file .h:
Dalam file .m:
Kemudian dengarkan interaksi lainnya:
Kemudian terapkan
dismissKeyboard
:Dan jika, seperti saya, Anda ingin menutup keyboard untuk UITextField di dalam sel tabel kustom:
Semoga bisa membantu siapa pun yang mencari !!
sumber
sumber
Inilah versi cepat untuk kesenangan pengkodean Anda:
Ia menambahkan pengenal gerakan tap lalu menutup keyboard. Tidak ada outlet untuk TextField diperlukan!
sumber
Ada versi Swift 3 tanpa memblokir ketukan pada sel.
Dalam
viewDidLoad()
metode:Dan
hideKeyboard
terlihat seperti ini:sumber
Saya melakukannya seperti ini:
Buat metode di TableViewController Anda untuk menonaktifkan responden pertama (yang akan menjadi TextBox Anda pada saat itu)
Dalam
tableView:didSelectRowAtIndexPath:
memanggil metode sebelumnya:sumber
didSelectRowAtIndexPath
tidak akan menyala jika Anda mengetuk TableView itu sendiri.Saya memiliki
UITableViewController
dan penerapantouchesBegan:withEvent:
tidak berhasil untuk saya.Inilah yang berhasil:
Cepat:
Objective-C:
sumber
Kemudian pastikan bahwa dalam file NIB Anda, Anda menetapkan jenis UITableView Anda ke DismissableUITableView ..... mungkin saya bisa memikirkan nama yang lebih baik untuk kelas ini, tetapi Anda mengerti maksudnya.
sumber
Jika Anda menargetkan iOS7, Anda dapat menggunakan salah satu dari berikut ini:
Yang pertama akan menganimasikan keyboard dari layar ketika tampilan tabel digulir dan yang kemudian akan menyembunyikan keyboard seperti aplikasi Pesan stok.
Perhatikan bahwa ini dari
UIScrollView
, yangUITableView
diwarisi dari.sumber
Coba ini:
sumber
UITableView adalah subclass dari UIScrollView.
Cara saya melakukannya adalah dengan mendengarkan acara gulir oleh pengguna dan kemudian resignFirstResponder. Berikut metode UIScrollViewDelegate untuk diterapkan dalam kode Anda;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
Ketika mendekati masalah semacam ini, saya telah menemukan cara terbaik adalah dengan meneliti protokol delegasi untuk setiap objek dan kelas induk (dalam hal ini UITableViewDelegate, UIScrollViewDelegate. Jumlah peristiwa yang diaktifkan objek NS cukup besar dan komprehensif. Ini juga lebih mudah menerapkan protokol kemudian mensubkelas apapun.
sumber
Saya memiliki masalah yang sama dan inilah solusi saya, ini bekerja dengan sempurna untuk saya:
Dalam tampilan atau pengontrol tampilan yang Anda terapkan
<UITextFieldDelegate>
(Dalam kasus saya, saya memiliki kebiasaan
UITableViewCell
disebut TextFieldCell),Nyatakan
UITapGestureRecognizer
sebagai properti:Dan lakukan inisialisasi di tampilan / pengontrol Anda:
Dalam
- (void)textFieldDidBeginEditing:(UITextField *)textField
metode ini, gunakansuperView
untuk naik ke tableView Anda dan panggiladdGestureRecognizer
:Dan di
- (void)textFieldDidEndEditing:(UITextField *)textField
, hapus saja pengenal isyarat:Semoga membantu.
sumber
Saya ingin sel saya membuka keyboard ketika ada bagian dari sel yang dipilih dan menutupnya jika Anda mengklik di mana saja dari sel. Untuk membuka keyboard:
(CATATAN: Saya telah membuat subkelas sel tetapi Anda dapat dengan mudah mencapai ini dalam
tableView:didSelectRowAtIndexPath:
metode delegasiUITableView
)Melakukan ini berarti bahwa dengan solusi teratas jika Anda mengklik sel dua kali, keyboard akan berguncang karena, pertama pengenal gerakan mencoba menutup keyboard, dan kedua sel dipilih kembali dan mencoba membuka keyboard.
Solusinya adalah memeriksa apakah klik terjadi di dalam sel yang saat ini dipilih:
sumber
Saya telah menemukan solusi yang bekerja dengan baik.
Diperlukan untuk menggunakan UIGestureRecognizerDelegate dan metode - gestureRecognizer: shouldReceiveTouch: .
Tambahkan pengenal gerakan ke TableView sebagai berikut:
Kemudian, implementasikan metode delegasi shouldReceiveTouch untuk menolak sentuhan yang dilakukan di kelas UITableViewCell. The hideKeyboard metode hanya akan dipanggil ketika disentuh telah dilakukan di luar kelas UITableViewCell.
sumber
UITableView
memilikibackgroundView
properti praktis , yang dengannya saya mencapai perilaku ini tanpa mengotak-atik pemilihan sel, seperti yang ditunjukkan di bawah ini di Swift:sumber
Saya sedang mencari solusi dan tidak menemukan apa pun yang sesuai dengan kode saya, jadi saya melakukannya seperti ini:
http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap
Ini pada dasarnya adalah kombinasi dari pendekatan yang disebutkan sebelumnya tetapi tidak perlu membuat subkelas apa pun atau untuk membuat tombol latar belakang.
sumber
Cukup menggunakan UITapGestureRecognizer dan
cancelsTouchesInView = NO
berarti mengetuk sel dan UITextView juga memicu persembunyian. Ini buruk jika Anda memiliki beberapa UITextView dan Anda mengetuk UITextView berikutnya. Keyboard akan mulai bersembunyi dan textView berikutnya menjadi firstResponder dan keyboard menjadi terlihat lagi. Untuk menghindarinya, periksa lokasi ketuk dan hanya sembunyikan keyboard jika ketuk tidak ada di sel:Agar
scrollViewWillBeginDragging:
dapat dipicu,scrollEnabled
properti tableView haruslahYES
sumber
Mengapa Anda ingin membuat tabel yang penuh dengan bidang teks? Anda harus menggunakan tampilan rinci untuk setiap baris yang berisi bidang teks. Saat Anda mendorong tampilan mendetail, pastikan Anda memanggil "[myTextField intoFirstResponder]" sehingga pengguna dapat mulai mengedit hanya dengan satu klik dari daftar tabel.
sumber
Jika Anda ingin membuat subclass (ugh!) Tampilan tabel Anda, sesuatu seperti ini mungkin berhasil:
sumber
Jika Anda ingin menutup keyboard saat tombol kembali ditekan, Anda cukup menambahkan kode berikut di textField should return method yaitu:
Beberapa bidang teks mungkin memiliki tampilan pemetik atau yang lain sebagai subview, jadi dalam hal ini metode di atas tidak berfungsi sehingga dalam hal ini kita perlu menggunakan kelas UITapGestureRecognizer, yaitu tambahkan cuplikan kode berikut ke metode viewDidLoad, yaitu:
Sekarang cukup tambahkan resign responder ke metode selector yaitu:
Semoga membantu, terima kasih :)
sumber
Banyak jawaban menarik. Saya ingin menyusun pendekatan yang berbeda ke dalam solusi yang menurut saya paling sesuai dengan skenario UITableView (ini yang biasanya saya gunakan): Yang biasanya kami inginkan pada dasarnya adalah menyembunyikan keyboard pada dua skenario: saat mengetuk di luar elemen Text UI, atau saat menggulir ke bawah / atas UITableView. Skenario pertama kita dapat dengan mudah menambahkan melalui TapGestureRecognizer, dan yang kedua melalui metode UIScrollViewDelegate scrollViewWillBeginDragging :. Urutan bisnis pertama, metode untuk menyembunyikan keyboard:
Metode ini mengembalikan UI bidang teks apa pun dari sub-tampilan dalam hierarki tampilan UITableView, jadi lebih praktis daripada mengundurkan diri setiap elemen secara independen.
Selanjutnya kami akan menangani pembubaran melalui gerakan Tap di luar, dengan:
Menyetel tapGestureRecognizer.cancelsTouchesInView ke NO adalah untuk menghindari gestureRecognizer menimpa cara kerja normal dalam UITableView (misalnya, tidak mengganggu Seleksi sel).
Terakhir, untuk menangani penyembunyian keyboard saat Menggulir ke atas / bawah UITableView, kita harus mengimplementasikan protokol UIScrollViewDelegate scrollViewWillBeginDragging: metode, sebagai:
file .h
file .m
Saya harap ini membantu! =)
sumber
Inilah cara saya akhirnya membuat karya. Saya menggabungkan saran dan kode dari jawaban yang berbeda. Fitur: menutup keyboard, memindahkan bidang teks di atas keyboard saat mengedit dan menyetel jenis kembali keyboard "Berikutnya" dan "Selesai". GANTI "..." dengan lebih banyak bidang
sumber
@ Jawaban mixca sangat berguna tetapi bagaimana jika saya memiliki sesuatu yang berbeda dari UITextField. Saya pikir cara terbaik untuk menanganinya dengan mencari semua subview tampilan utama dengan fungsi rekursif, periksa contoh di bawah ini
dan juga Anda dapat meletakkan metode ini ke kelas utilitas Anda dan dapat menggunakan dari gerakan tap seperti jawaban @ mixca ..
sumber
Cepat 4 / 4.2 / 5
Anda juga dapat menutup keyboard saat sel diketuk - sebelum melakukan hal lain.
sumber
tableView.keyboardDismissMode = .onDrag // .interactive
sumber