Saya perlu memeriksa kondisi visibilitas keyboard di aplikasi iOS saya.
Pseudocode:
if(keyboardIsPresentOnWindow) {
//Do action 1
}
else if (keyboardIsNotPresentOnWindow) {
//Do action 2
}
Bagaimana cara memeriksa kondisi ini?
ios
objective-c
keyboard
Jitendra Singh
sumber
sumber
Jawaban:
… Atau ambil cara mudahnya:
Saat Anda memasukkan textField, itu menjadi responder pertama dan keyboard muncul. Anda dapat memeriksa status keyboard dengan
[myTextField isFirstResponder]
. Jika kembaliYES
, maka keyboard aktif.sumber
kode drawonward sangat dekat, tetapi bertabrakan dengan namespace UIKit dan dapat dibuat lebih mudah untuk digunakan.
sumber
+load
adalah metode khusus yang disebut runtime Objective-C. Ini dipanggil untuk setiap kelas setelah biner aplikasi dimuat, tetapi sebelummain()
fungsi dimasukkan. Tidak ada jaminan bahwa kumpulan rilis otomatis akan ditayangkan.NSAutoreleasePool
alloc
/release
sekarang dapat diganti dengan mengelilingi kode di@autoreleasepool { }
Buat
UIKeyboardListener
ketika Anda tahu keyboard tidak terlihat, misalnya dengan menelepon[UIKeyboardListener shared]
dariapplicationDidFinishLaunching
.sumber
+(void)load
untuk memanggil init pada kelas pemroses ini sehingga secara umum akan berfungsi sebagai seret-dan-lepas ke dalam proyek apa pun dan menginisialisasi dari peluncuran aplikasi kedua daripada Anda harus ingat untuk memasukkannya di mana saja.Saya rasa Anda perlu menggunakan pemberitahuan yang disediakan tentang keyboard:
Dari: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITextField_Class/Reference/UITextField.html
sumber
Implementasi Swift 3
sumber
Menggunakan hierarki subview jendela sebagai indikasi untuk menampilkan keyboard adalah hack. Jika Apple mengubah implementasi yang mendasarinya, semua jawaban ini akan rusak.
Cara yang benar adalah dengan memantau tampilan Keyboard dan menyembunyikan aplikasi notifikasi secara luas seperti di dalam Delegasi Aplikasi Anda:
Di AppDelegate.h:
Di AppDelegate.m:
Kemudian Anda dapat memeriksa menggunakan:
Perlu dicatat bahwa notifikasi tampilkan / sembunyikan keyboard tidak akan menyala saat pengguna menggunakan bluetooth atau keyboard eksternal.
sumber
Tambahkan ekstensi
Kemudian periksa apakah keyboard ada,
sumber
guard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
Ini dari Panduan Pemrograman Teks iOS yang diterbitkan oleh Apple di sini: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
Pada dasarnya panggil "registerForKeyBoardNotifications" di ViewDidLoad Anda. Kemudian setiap kali keyboard menjadi aktif, "keyboardWasShown" dipanggil. Dan setiap kali keyboard menghilang, "keyboardWillBeHidden" dipanggil.
sumber
Sekarang di iOS8 solusi ini tentu saja tidak berfungsi. Itu awalnya ditulis untuk IOS4 / 5.
Coba solusi ini:
sumber
Beberapa pengamatan:
Pola yang direkomendasikan untuk objek tunggal adalah sebagai berikut. dispatch_once memastikan kelas diinisialisasi satu kali dengan cara yang aman bagi thread, dan variabel statis tidak terlihat di luar. Dan itu adalah GCD standar, jadi tidak perlu tahu tentang detail level rendah Objective-C.
Biasanya Anda tidak ingin tahu hanya apakah keyboard itu terlihat atau tidak, tetapi seberapa besar ukurannya. Keyboard tidak semuanya memiliki ukuran yang sama. Papan tombol iPhone lebih kecil dari papan ketik iPad. Jadi Anda ingin properti lain
@property (readonly, nonatomic) CGRect keyboardRect;
yang disetel dalam metode noticeShowKeyboard: seperti ini:Penting untuk diperhatikan bahwa persegi panjang berada dalam koordinat UIWindow dan tidak memperhatikan rotasi layar. Jadi penelepon akan mengubah persegi panjang itu dengan menelepon
Jika pengguna memutar layar saat keyboard terlihat, aplikasi akan diberi tahu bahwa keyboard tersembunyi, lalu ditampilkan lagi. Saat ditampilkan, tampilan lain kemungkinan besar belum dirotasi. Jadi, jika Anda mengamati sendiri acara sembunyikan / tampilkan keyboard, konversikan koordinat saat Anda benar-benar membutuhkannya, bukan di pemberitahuan.
Jika pengguna memisahkan atau melepaskan keyboard, atau menggunakan keyboard hardware, notifikasi akan selalu menampilkan keyboard sebagai tersembunyi. Melepas atau menggabungkan keyboard akan mengirimkan notifikasi "keyboard ditampilkan".
Pendengar harus dijalankan saat keyboard disembunyikan, jika tidak, pemberitahuan pertama akan terlewat, dan akan dianggap bahwa keyboard disembunyikan padahal tidak.
Jadi, sangatlah penting untuk mengetahui apa yang sebenarnya Anda inginkan. Kode ini berguna untuk memindahkan barang-barang keluar dari jalan keyboard (dengan keyboard yang terbelah atau tidak terkunci, itu adalah tanggung jawab pengguna). Itu tidak memberi tahu Anda apakah pengguna dapat melihat keyboard di layar (dalam kasus keyboard terpisah). Itu tidak memberi tahu Anda apakah pengguna dapat mengetik (misalnya ketika ada keyboard perangkat keras). Melihat jendela lain tidak berfungsi jika aplikasi membuat jendela lain itu sendiri.
sumber
Swift implementasi:
Karena swift tidak menjalankan metode pemuatan kelas saat memulai, penting untuk memulai layanan ini saat peluncuran aplikasi:
sumber
Ini adalah solusi saya, ini merangkum semuanya menjadi satu metode statis, dan Anda dapat memanggilnya di mana saja untuk memeriksanya:
sumber
Dan inilah cara melakukannya di Swift:
Jangan lupa untuk membatalkan pendaftaran:
Dan jika Anda ingin menutup keyboard saat menekan tombol "Kembali":
sumber
Coba fungsi ini
}
from: iOS: Bagaimana cara mengakses `UIKeyboard`?
sumber
BOOL isTxtOpen = [txtfieldObjct isFirstReponder]. Jika mengembalikan YA, maka keyboard aktif.
sumber
Untuk memeriksa apakah keyboard cuaca muncul, kita dapat menggunakan pemberitahuan Keyboard yang telah ditentukan sebelumnya.
UIKeyboardDidShowNotification, UIKeyboardDidHideNotification
Misalnya saya dapat menggunakan kode berikut untuk mendengarkan notifikasi keyboard
// Dengarkan penampilan dan penghilangan keyboard
dalam metode saya bisa mendapatkan notifikasi
sumber
Cepat 4
sumber
Anda dapat memeriksa semua tampilan teks, bidang teks, dan label secara berulang di sub-tampilan tampilan induk untuk melihat apakah ada responden pertama dengan sesuatu seperti ini:
sumber
SWIFT 4.2 / SWIFT 5
sumber
Saya pikir ini dapat membantu Anda,
Terima kasih,
Naveen Shan
sumber