Saya memiliki beberapa kontrol yang tersebar di banyak sel tabel di meja saya, dan saya bertanya-tanya apakah ada cara yang lebih mudah untuk mengabaikan keyboard tanpa harus mengulang semua kontrol saya dan mengundurkan semuanya sebagai responden pertama. Saya kira pertanyaannya adalah ... Bagaimana saya mendapatkan responden pertama saat ini ke keyboard?
objective-c
cocoa-touch
sdk
Seventoes
sumber
sumber
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Jawaban:
Mencoba:
sumber
[self.view endEditing:YES];
karena nilai-nilai BOOL adalah YA / TIDAK di Objective-C.Anda dapat memaksa tampilan pengeditan saat ini untuk mengundurkan diri dengan status responden pertamanya
[view endEditing:YES]
. Ini menyembunyikan keyboard.Tidak seperti itu
-[UIResponder resignFirstResponder]
,-[UIView endEditing:]
akan mencari melalui subview untuk menemukan responden pertama saat ini. Jadi Anda dapat mengirimnya ke tampilan tingkat atas Anda (mis.self.view
Dalam aUIViewController
) dan itu akan melakukan hal yang benar.(Jawaban ini sebelumnya mencakup beberapa solusi lain, yang juga berfungsi tetapi lebih rumit daripada yang diperlukan. Saya telah menghapusnya untuk menghindari kebingungan.)
sumber
[self.view endEditing:YES];
jawabannya lebih baik.[UIView endediting:]
kerjanya. Di salah satu aplikasi yang saya kembangkan, kotak pencarian ditambahkan di UINavigationViewController, jika Anda hanya memanggil[self.view endEditing:YES]
, sebagaiself
pengontrol tampilan Anda, ini tidak akan berfungsi, sebagai gantinya, saya memanggil metode ini secara langsung dalam lingkup tampilan tempat kotak pencarian ditambahkan, contoh:[self.mySearchBoxView endEditing:YES]
.Anda dapat mengirim tindakan nihil yang ditargetkan ke aplikasi, itu akan mengundurkan diri responden pertama kapan saja tanpa harus khawatir tentang tampilan yang saat ini memiliki status responden pertama.
Tujuan-C:
Swift 3.0:
Tindakan bertarget nil adalah umum di Mac OS X untuk perintah menu, dan berikut adalah penggunaannya di iOS.
sumber
Sejujurnya, saya tidak tergila-gila dengan solusi yang diusulkan di sini. Saya memang menemukan cara yang bagus untuk menggunakan TapGestureRecognizer yang menurut saya menjadi inti masalah Anda: Ketika Anda mengklik pada apa pun selain keyboard, abaikan keyboard.
Di viewDidLoad, daftar untuk menerima notifikasi keyboard dan membuat UITapGestureRecognizer:
Tambahkan acara keyboard / sembunyikan responden. Di sana Anda menambah dan menghapus TapGestureRecognizer ke UIView yang harus mengabaikan keyboard saat diketuk. Catatan: Anda tidak harus menambahkannya ke semua sub-tampilan atau kontrol.
TapGestureRecognizer akan memanggil fungsi Anda saat mendapat ketukan dan Anda dapat mengabaikan keyboard seperti ini:
Yang menyenangkan tentang solusi ini adalah hanya menyaring Taps, bukan gesekan. Jadi jika Anda memiliki konten gulir di atas keyboard, gesekan masih akan menggulir dan membiarkan keyboard ditampilkan. Dengan menghapus pengenal isyarat setelah keyboard hilang, ketukan berikutnya pada tampilan Anda ditangani secara normal.
sumber
Ini adalah solusi untuk membuat keyboard hilang ketika menekan
return
di bidang teks apa pun , dengan menambahkan kode di satu tempat (jadi tidak perlu menambahkan penangan untuk setiap bidang teks):pertimbangkan skenario ini:
saya punya
viewcontroller
dengan dua bidang teks (nama pengguna dan kata sandi). dan protokolviewcontroller
implementasinyaUITextFieldDelegate
saya melakukan ini di viewDidLoad
dan viewcontroller mengimplementasikan metode opsional sebagai
dan terlepas dari bidang teks Anda, segera setelah saya menekan
return
di keyboard, itu akan diberhentikan!Dalam kasus Anda, hal yang sama akan berfungsi selama Anda mengatur semua delegasi bidang teks untuk diterapkan dan diterapkan
textFieldShouldReturn
sumber
Pendekatan yang lebih baik adalah memiliki sesuatu yang "mencuri" status responden pertama.
Karena aplikasi UIA adalah subkelas dari UIResponder, Anda dapat mencoba:
Jika gagal, buat UITextField baru dengan bingkai berukuran nol, tambahkan ke tampilan di suatu tempat dan lakukan hal serupa (diikuti oleh pengunduran diri).
sumber
Menyimpan ini di beberapa kelas utilitas.
sumber
@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:
Sangat brilian!
Terima kasih.
Mempertimbangkan saran Anda dan saran orang lain di utas ini, inilah yang telah saya lakukan:
Seperti apa saat digunakan:
[[self appDelegate] dismissKeyboard];
(catatan: Saya menambahkan appDelegate sebagai tambahan untuk NSObject sehingga saya dapat menggunakan apa saja di mana saja)Seperti apa di bawah tenda:
EDIT
Amandemen jawaban saya untuk dimasukkan
tempTextField.enabled = NO;
. Menonaktifkan bidang teks akan mencegahUIKeyboardWillShowNotification
danUIKeyboardWillHideNotification
notifikasi keyboard dikirim jika Anda mengandalkan notifikasi ini di seluruh aplikasi Anda.sumber
Kiat cepat tentang cara menghilangkan keyboard di iOS ketika pengguna menyentuh di mana saja di layar di luar UITextField atau keyboard. Mempertimbangkan berapa banyak real estat yang dapat diambil oleh keyboard iOS, masuk akal untuk memiliki cara yang mudah dan intuitif bagi pengguna Anda untuk mengabaikan keyboard.
Ini tautannya
sumber
Banyak jawaban yang terlalu rumit di sini, mungkin karena ini tidak mudah ditemukan di dokumentasi iOS. JosephH tepat di atas:
sumber
Bahkan lebih sederhana dari jawaban Meagar
menimpa
touchesBegan:withEvent:
Ini akan
dismiss the keyboard
ketika Anda menyentuh di mana saja di jendelabackground
.sumber
Inilah yang saya gunakan dalam kode saya. Itu bekerja seperti pesona!
Di yourviewcontroller.h tambahkan:
@property (nonatomic) UITapGestureRecognizer *tapRecognizer;
Sekarang dalam file .m, tambahkan ini ke fungsi ViewDidLoad Anda:
Juga, tambahkan fungsi ini dalam file .m:
sumber
Dalam file header pengontrol tampilan Anda, tambahkan
<UITextFieldDelegate>
definisi antarmuka pengontrol Anda agar sesuai dengan protokol delegasi UITextField ...... Dalam file implementasi pengontrol (.m) tambahkan metode berikut, atau kode di dalamnya jika Anda sudah memiliki metode viewDidLoad ...
... Lalu, tautkan Kotak Teks Anda ke bidang teks Anda yang sebenarnya
sumber
Anda harus mengirim
endEditing:
ke jendela kerja sebagai subclass dariUIView
sumber
Cara terbaik untuk menghilangkan keyboard dari UITableView dan UIScrollView adalah:
sumber
Dalam 3 cepat Anda dapat melakukan hal berikut
sumber
Jawaban Jeremy tidak cukup untuk saya, saya pikir karena saya memiliki tumpukan navigasi dalam tampilan tab dengan dialog modal di atasnya. Saya menggunakan yang berikut ini sekarang dan berfungsi untuk saya, tetapi jarak tempuh Anda mungkin berbeda.
sumber
Anda juga mungkin perlu mengganti UIViewController menonaktifkan NonaktifKeyboardDismissal agar ini berfungsi dalam beberapa kasus. Ini mungkin harus dilakukan pada UINavigationController jika Anda memilikinya.
sumber
Subkelas bidang teks Anda ... dan juga tampilan teks
Di subclass masukkan kode ini ..
Dalam delegasi bidang teks (mirip untuk delegasi tampilan teks)
Semua sudah diatur .. Sekarang cukup kirimkan pemberitahuan dari mana saja dalam kode Anda. Ini akan mengundurkan diri keyboard apa pun.
sumber
Dan dengan cepat bisa kita lakukan
sumber
Untuk mengabaikan keyboard setelah keyboard muncul, ada 2 kasus ,
ketika UITextField berada di dalam UIScrollView
ketika UITextField berada di luar UIScrollView
2. ketika UITextField berada di luar UIScrollView, ganti metode dalam subkelas UIViewController Anda
Anda juga harus menambahkan delegasi untuk semua UITextView
untuk membuat IBAction, tekan ctrl + klik UITapGesture dan seret ke file .h dari viewcontroller.
Di sini saya menamai tappedEvent sebagai nama tindakan saya
Informasi yang diberikan di atas berasal dari tautan berikut, silakan merujuk untuk informasi lebih lanjut atau hubungi saya jika Anda tidak memahami data di atas.
http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/
sumber
Saya benci bahwa tidak ada cara "global" untuk secara program mengabaikan keyboard tanpa menggunakan panggilan API pribadi. Seringkali, saya harus mengabaikan keyboard secara terprogram tanpa mengetahui objek apa yang menjadi responden pertama. Saya telah memilih untuk memeriksa
self
menggunakan runtime API Objective-C, menghitung melalui semua propertinya, menarik keluar yang bertipeUITextField
, dan mengirimkan merekaresignFirstResponder
pesan .Seharusnya tidak sesulit ini untuk melakukan ini ...
sumber
Itu tidak cantik, tetapi cara saya mengundurkan diri responden pertama ketika saya tidak tahu apa itu responden:
Buat UITextField, baik dalam IB atau secara terprogram. Jadikan itu Tersembunyi. Tautkan ke kode Anda jika Anda membuatnya di IB. Kemudian, ketika Anda ingin mengabaikan keyboard, Anda mengalihkan responden ke bidang teks yang tidak terlihat, dan segera mengundurkan diri:
sumber
Anda dapat secara berulang mengulangi melalui subview, menyimpan array dari semua UITextFields, dan kemudian loop melalui mereka dan mengundurkan diri semuanya.
Sebenarnya bukan solusi yang hebat, terutama jika Anda memiliki banyak subview, tetapi untuk aplikasi sederhana itu harus melakukan trik.
Saya memecahkan ini dengan cara yang jauh lebih rumit, tetapi jauh lebih berkinerja, tetapi menggunakan singleton / manajer untuk mesin animasi aplikasi saya, dan setiap kali bidang teks menjadi responden, saya akan menetapkan menetapkannya ke statis yang akan mendapatkan tersapu (mengundurkan diri) berdasarkan peristiwa lain tertentu ... hampir tidak mungkin bagi saya untuk menjelaskan dalam paragraf.
Jadilah kreatif, hanya perlu 10 menit untuk memikirkan ini untuk aplikasi saya setelah saya menemukan pertanyaan ini.
sumber
Metode yang sedikit lebih kuat yang perlu saya gunakan baru-baru ini:
Saya menemukan beberapa metode "global" lainnya tidak berfungsi (misalnya,
UIWebView
&WKWebView
menolak untuk mengundurkan diri).sumber
Tambahkan A Tap Gesture Recognizer ke tampilan Anda. Dan tentukan ibaction
file .m Anda akan seperti
Ini berhasil untuk saya
sumber
Ya, endEditing adalah pilihan terbaik. Dan Dari iOW 7.0,
UIScrollView
memiliki fitur keren untuk mengabaikan keyboard saat berinteraksi dengan tampilan gulir. Untuk mencapai ini, Anda dapat mengaturkeyboardDismissMode
propertiUIScrollView
.Tetapkan mode pemberhentian keyboard sebagai:
Ini memiliki beberapa jenis lainnya. Lihatlah dokumen apel ini .
sumber
Dengan cepat:
sumber
cara paling mudah adalah memanggil metode
sumber
Anda harus menggunakan salah satu metode ini,
atau
sumber