Apakah ada cara untuk mendeteksi ketika tombol Backspace/ Deleteditekan di keyboard iPhone pada UITextField
yang kosong? Saya ingin tahu kapan Backspaceditekan hanya jika UITextField
kosong.
Berdasarkan saran dari @Alex Reynolds dalam komentar, saya telah menambahkan kode berikut saat membuat bidang teks saya:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTextFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:searchTextField];
Notifikasi ini diterima ( handleTextFieldChanged
fungsi dipanggil), tetapi tetap tidak ketika saya menekan Backspacetombol di bidang kosong. Ada ide?
Tampaknya ada beberapa kebingungan di sekitar pertanyaan ini. Saya ingin menerima pemberitahuan ketika Backspacetombol ditekan. Itu dia. Tetapi solusinya juga harus bekerja ketika UITextField
sudah kosong.
ios
iphone
uitextfield
backspace
marcc
sumber
sumber
Jawaban:
Ini mungkin pukulan panjang tetapi bisa berhasil. Cobalah mengatur teks bidang teks ke karakter spasi nol lebar
\u200B
. Ketika backspace ditekan pada bidang teks yang tampak kosong, itu benar-benar akan menghapus ruang Anda. Maka Anda bisa memasukkan kembali ruang.Mungkin tidak berfungsi jika pengguna berhasil memindahkan tanda sisipan di sebelah kiri ruang.
sumber
UITextField
dan melaksanakancanPerformAction:withSender:
untukreturn NO
untukselect:
danselectAll:
tindakan ketika teks sama dengan string@"\u200B"
.Swift 4:
Subkelas
UITextField
:Penerapan:
Tujuan-C:
Subkelas
UITextField
:Sekarang cukup tambahkan MyTextFieldDelegate ke Anda
UIViewController
dan aturUITextFields
myDelegate Anda keself
:sumber
ViewController
kelas jika saya mengatur delegasi textfield saya menjadi subkelasUITextField
alih-alihUIViewController
deleteBackward()
tidak akan dipanggil jika Anda beradareturn false
ditextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
Pembaruan: Lihat jawaban JacobCaraballo untuk contoh yang mengabaikan
-[UITextField deleteBackward]
.Lihat
UITextInput
, secara khususUIKeyInput
memilikideleteBackward
metode delegasi yang selalu dipanggil ketika tombol hapus ditekan. Jika Anda melakukan sesuatu yang sederhana, maka Anda dapat mempertimbangkan hanya subklasUILabel
dan membuatnya sesuai denganUIKeyInput
protokol, seperti yang dilakukan oleh SimpleTextInput dan Contoh UIKeyInput iPhone ini . Catatan:UITextInput
dan kerabatnya (termasukUIKeyInput
) hanya tersedia di iOS 3.2 dan yang lebih baru.sumber
Kode seperti berikut:
Akhirnya, jangan lupa untuk mengubah properti Kelas Kustom dari Bidang Teks ke "MyTextField"
sumber
Implementasi cepat:
sumber
Saya telah menemukan cara lain yang lebih mudah daripada
subclass
solusi. Walaupun sedikit aneh tapi berfungsi dengan baik.Agak aneh untuk hasil bandingkan adalah -8. Mungkin saya akan salah dalam beberapa hal
C Programming
. Tapi itu berfungsi dengan benar;)sumber
strcmp
kembali juga-1, 0, or 1
? Itulah pengertian saya.UITextViewDelegate
metode, bukanUITextFieldDelegate
.Coba
delegate
Kemudian periksa apakah
range.length == 1
yang tampaknya menjadi kasus ketikabackspace
dipukul.sumber
silakan gunakan kode di bawah ini akan membantu Anda mendeteksi tombol hapus keyboard bahkan jika bidang teks Anda kosong.
Sasaran C:
- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }
Cepat:
sumber
Jawaban Niklas Alvaeus membantu saya keluar dengan masalah serupa
Saya membatasi entri ke set karakter tertentu, tetapi mengabaikan ruang mundur. Jadi saya memeriksanya
range.length == 1
sebelum memotongNSString
. Jika itu benar, saya hanya mengembalikan string dan tidak memotongnya. Lihat di bawahsumber
Untuk orang-orang yang memiliki masalah tentang jawaban Yakub saya menerapkan subkelas textfield saya sebagai berikut dan itu bekerja dengan baik!
sumber
Yup, gunakan metode di bawah ini untuk mendeteksi backspace, ketika textField kosong.
Perlu menambahkan UITextFieldDelegate
yourTextField.delegate = diri (HARUS DIBUTUHKAN)
Cepat:
Sasaran C:
sumber
Penggunaan terbaik yang saya temukan untuk mendeteksi backspace adalah mendeteksi ketika pengguna telah menekan backspace dalam keadaan kosong
UITextField
. Misalnya, jika Anda memiliki penerima 'bubbled' di aplikasi email, ketika Anda menekan backspace diUITextField
, itu memilih penerima 'bubbled' terakhir.Ini bisa dilakukan dengan cara yang mirip dengan jawaban Jacob Caraballo. Tetapi dalam jawaban Jacob, jika
UITextField
satu karakter tersisa ketika Anda menekan backspace, pada saat pesan delegasi diterima,UITextField
sudah akan kosong, jadi Anda secara efektif mendeteksibackspace
pada bidang teks dengan paling banyak satu karakter.Sebenarnya, jika Anda ingin mendeteksi
backspace
padaUITextField
karakter yang benar-benar nol (kosong), maka Anda harus mengirim pesan kedelegate
sebelum panggilansuper deleteBackward
. Sebagai contoh:Antarmuka untuk bidang teks seperti itu akan terlihat seperti ini:
sumber
Di iOS 6, metode deleteBackward dipanggil di UITextField saat backspace ditekan, termasuk saat bidang kosong. Jadi Anda dapat subkelas UITextField dan memberikan implementasi deleteBackward Anda sendiri (memanggil super juga.)
Saya masih mendukung iOS 5 jadi saya akan membutuhkan kombinasi jawaban Andrew dan ini.
sumber
:) hanya untuk judul "Deteksi backspace", tempat saya menggunakan
UIKeyboardTypeNumberPad
.Saya juga menjawab pertanyaan yang sama malam ini, dan berikut ini adalah kode saya untuk mengetahuinya:
Karena dengan
UIKeyboardTypeNumberPad
, pengguna hanya dapat memasukkan angka atau backspace, jadi ketika panjang string adalah 0, itu harus menjadi kunci backspace.Semoga hal di atas akan membantu.
sumber
Daripada mencoba untuk membangun apa yang AKAN MENJADI di bidang teks atau mencari tahu karakter khusus apa yang telah dimasukkan dalam
shouldChangeCharactersInRange
metode ini, saya sarankan melakukan yang berikut:Ini memungkinkan Anda untuk memanggil metode secara langsung setelah operasi saat ini selesai. Apa yang keren tentang ini adalah bahwa, pada saat itu selesai, nilai yang diubah akan berada di
UITextField
. Pada titik itu, Anda bisa memeriksa panjangnya dan / atau memvalidasi berdasarkan apa yang ada di sana.sumber
Subclassing UITextField tidak berfungsi untuk saya di iOS 8.3, deleteBackward tidak pernah dipanggil.
Berikut adalah solusi yang saya gunakan, bekerja pada semua versi iOS 8 dan juga harus bekerja pada versi iOS lainnya
sumber
Dalam file .h tambahkan delegasi UIKeyInput
Pemformatan yang ditingkatkan
sumber
Saya telah menerapkan solusi serupa dengan perbaikan kecil yang akan memberi tahu saya bahwa jika bidang teks memiliki nilai sementara pengguna telah mengetuk backspace. Ini berguna untuk kasus saya ketika saya hanya harus fokus pada bidang teks lain jika bidang teks kosong ketika backspace ditekan.
sumber
Jawaban yang paling populer adalah satu hal - kemampuan untuk mendeteksi apakah bidang teks kosong atau tidak.
Yaitu, saat Anda mengganti metode deleteBackwards () dari subkelas TextField, Anda masih tidak tahu apakah bidang teks sudah kosong. (Baik sebelum dan sesudah deleteBackwards (),
textField.text!
adalah string kosong:""
)Inilah peningkatan saya, dengan memeriksa kekosongan sebelum penghapusan.
1. Buat protokol delegasi yang memperluas UITextFieldDelegate
2. Subkelas UITextField
3. Terapkan protokol delegasi baru Anda
sumber
Penangan komprehensif untuk bidang teks dengan nomor satu digit untuk Swift 5.1 :
1 Langkah
2 Langkah
3 Langkah
sumber
Di sini solusi saya berdasarkan ide @andrew:
suatu tempat, misalnya di viewDidLoad
lalu
sumber
Anda dapat memeriksa teks dari tampilan teks / bidang untuk melihat apakah itu kosong dan pastikan teks pengganti juga kosong dalam metode delegasi shouldChangeTextIn.
sumber
Sesuatu seperti ini:
Tentu saja hash adalah untuk satu karakter string.
sumber
Menggunakan metode Delegasi TextField:
Tambahkan kode berikut dalam metode di atas untuk mendeteksi acara yang dihapus
sumber
Agar Tetap Sederhana di sini adalah satu-satunya syarat yang perlu Anda periksa
sumber
sumber
Di
UITextViewDelegate
:itu berfungsi baik untuk saya.
pembaruan untuk input tulisan tangan dan tulisan tangan Cina sederhana:
berdasarkan dokumen mengatakan:
"Jika pengguna menekan
deleteKey
, panjang rentang adalah 1 dan objek string kosong menggantikan karakter tunggal itu."sumber
UITextField
, bukanUITextView
.