Bagaimana saya bisa mengatur jumlah maksimum karakter dalam UITextField
pada iPhone SDK ketika saya memuat UIView
?
ios
objective-c
cocoa-touch
uitextfield
Domness
sumber
sumber
Jawaban:
Meskipun
UITextField
kelas tidak memiliki properti panjang maks, relatif mudah untuk mendapatkan fungsionalitas ini dengan mengatur bidang teksdelegate
dan menerapkan metode delegasi berikut:Objektif-C
Cepat
Sebelum bidang teks berubah, UITextField bertanya kepada delegasi apakah teks yang ditentukan harus diubah. Bidang teks belum berubah pada saat ini, jadi kami mengambil panjang saat ini dan panjang string yang kami sisipkan (baik dengan menempelkan teks yang disalin atau mengetik satu karakter menggunakan keyboard), minus panjang jangkauan. Jika nilai ini terlalu panjang (lebih dari 25 karakter dalam contoh ini), kembali
NO
untuk melarang perubahan.Saat mengetikkan satu karakter di akhir bidang teks, itu
range.location
akan menjadi panjang bidang saat ini, danrange.length
akan menjadi 0 karena kami tidak mengganti / menghapus apa pun. Memasukkan ke tengah bidang teks hanya berarti berbedarange.location
, dan menempelkan beberapa karakter hanya berartistring
memiliki lebih dari satu karakter di dalamnya.Menghapus karakter tunggal atau memotong banyak karakter ditentukan oleh
range
dengan panjang tidak nol, dan string kosong. Penggantian hanyalah penghapusan rentang dengan string yang tidak kosong.Catatan tentang bug "undo" yang mogok
Seperti disebutkan dalam komentar, ada bug dengan
UITextField
yang dapat menyebabkan crash.Jika Anda menempel ke bidang, tetapi tempel dicegah oleh implementasi validasi Anda, operasi tempel masih dicatat dalam buffer undo aplikasi. Jika Anda kemudian mengaktifkan undo (dengan mengguncang perangkat dan mengonfirmasi Undo),
UITextField
akan mencoba untuk mengganti string yang dianggapnya disisipkan ke dalam dirinya sendiri dengan string kosong. Ini akan macet karena tidak pernah benar - benar menempelkan string ke dirinya sendiri. Ini akan mencoba mengganti bagian dari string yang tidak ada.Untungnya Anda dapat melindungi
UITextField
dari pembunuhan itu sendiri seperti ini. Anda hanya perlu memastikan bahwa rentang yang diusulkan untuk diganti memang ada dalam string saat ini. Inilah yang dilakukan pemeriksaan kewarasan awal di atas.Swift 3.0 dengan copy dan paste berfungsi dengan baik.
Semoga bermanfaat bagi Anda.
sumber
return newLength <= 25;
UITextField
di iPad iOS 8.1. (+1 memberi komentar). Apakah penulis akan menambahkan sesuatu tentang ini karena ini adalah jawaban berperingkat teratas? Saya senang melakukan pengeditan, tetapi milik saya secara teratur tampaknya ditolak! :-)Cepat 4
Sunting: masalah kebocoran memori diperbaiki.
sumber
Agustus terima kasih! ( Posting )
Ini adalah kode yang akhirnya berhasil:
sumber
return textField.text.length < MAX_LENGTH || range.length != 0;
Untuk melengkapi jawaban Agustus , kemungkinan implementasi fungsi yang diusulkan (lihat delegasi UITextField ).
Saya tidak menguji kode domness , tetapi milik saya tidak macet jika pengguna mencapai batasnya, dan itu kompatibel dengan string baru yang datang menggantikan yang lebih kecil atau sama.
sumber
Anda tidak dapat melakukan ini secara langsung -
UITextField
tidak memiliki atribut maxLength , tetapi Anda dapat mengaturUITextField's
delegasi, lalu gunakan:sumber
Seringkali Anda memiliki beberapa bidang input dengan panjang yang berbeda.
sumber
Cara terbaik adalah mengatur pemberitahuan tentang perubahan teks. Di Anda
-awakeFromNib
metode view controller Anda, Anda akan menginginkan:Kemudian di kelas yang sama tambahkan:
Kemudian tautkan outlet
myTextField
ke AndaUITextField
dan itu tidak akan membiarkan Anda menambahkan karakter lagi setelah Anda mencapai batas. Pastikan untuk menambahkan ini ke metode dealloc Anda:sumber
Saya membuat subclass UITextFieldLimit ini :
Raih
UITextFieldLimit.h
danUITextFieldLimit.m
dari repositori GitHub ini:https://github.com/JonathanGurebo/UITextFieldLimit
dan mulai menguji!
Tandai UITextField yang dibuat storyboard Anda dan tautkan ke subclass saya menggunakan Inspektur Identitas:
Kemudian Anda dapat menautkannya ke IBOutlet dan menetapkan batasnya (standarnya adalah 10).
File ViewController.h Anda harus berisi: (jika Anda tidak ingin mengubah pengaturan, seperti batasnya)
File ViewController.m Anda harus
@synthesize textFieldLimit
.Tetapkan batas panjang teks dalam file ViewController.m Anda:
Semoga kelas membantu Anda. Semoga berhasil!
sumber
Ini harus cukup untuk menyelesaikan masalah (ganti 4 dengan batas yang Anda inginkan). Pastikan untuk menambahkan delegasi di IB.
sumber
Gunakan ekstensi di bawah ini untuk mengatur panjang karakter maksimum a
UITextField
danUITextView
.Cepat 4.0
UITextView
Anda dapat mengatur batas di bawah ini.
sumber
Saya mensimulasikan penggantian string aktual yang akan terjadi untuk menghitung panjang string di masa depan:
sumber
Versi Swift 3 // ***** Ini TIDAK akan bekerja dengan Swift 2.x! ***** //
Pertama buat file Swift baru: TextFieldMaxLength.swift, dan kemudian tambahkan kode di bawah ini:
dan kemudian Anda akan melihat di Storyboard bidang baru (Panjang Maks) ketika Anda memilih TextField
jika Anda masih memiliki pertanyaan lain, lihat tautan ini: http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields -maksimum-panjang-visual-studio-gaya /
sumber
Menggunakan pembangun Antarmuka Anda dapat menautkan dan mendapatkan acara untuk "Editing berubah" di salah satu fungsi Anda. Sekarang di sana Anda dapat memeriksa panjangnya
sumber
Kode berikut ini mirip dengan jawaban sickp tetapi menangani operasi salin-rekat dengan benar. Jika Anda mencoba menempelkan teks yang lebih panjang dari batas, kode berikut akan memotong teks agar sesuai dengan batas alih-alih menolak operasi tempel sepenuhnya.
sumber
Ada solusi umum untuk mengatur panjang maks dalam Swift. Dengan IBInspectable Anda dapat menambahkan Atribut baru di Inspektur Atribut Xcode.
sumber
Untuk membuatnya bekerja dengan cut & paste string berapa pun, saya akan menyarankan mengubah fungsi menjadi sesuatu seperti:
sumber
Cepat 4
sumber
guard
?Swift 2.0 +
Pertama-tama buat kelas untuk proses ini. Mari kita sebut itu StringValidator.swift.
Kemudian tempel saja kode berikut di dalamnya.
Sekarang selamatkan kelas .....
Pemakaian..
Sekarang kebagian kelas viewController.swift Anda dan jadikan outlet textfield Anda sebagai ..
Sekarang kebagian metode textChangeCharCharactersInRange dan gunakan seperti berikut ini.
Jangan lupa untuk mengatur protokol delegasi / metode bidang teks.
Biarkan saya jelaskan tentang ini ... Saya menggunakan proses ekstensi sederhana dari string yang saya tulis di dalam kelas lain. Sekarang saya hanya memanggil metode ekstensi dari kelas lain di mana saya membutuhkannya dengan menambahkan cek dan nilai maksimum.
Fitur...
Jenis ...
berisiOnlyCharactersIn // Hanya Menerima Karakter.
berisiCharactersIn // Menerima kombinasi karakter
doesNotContainsCharactersIn // Tidak akan menerima karakter
Semoga ini bisa membantu .... Terima kasih ..
sumber
cepat 3.0
Kode ini berfungsi dengan baik ketika Anda menempelkan string lebih dari batas karakter Anda.
Terima kasih untuk suaramu. :)
sumber
Saya memberikan jawaban tambahan berdasarkan @Frouo. Saya pikir jawabannya adalah cara yang paling indah. Karena itu adalah kontrol umum yang dapat kita gunakan kembali.
sumber
Ini adalah cara yang benar untuk menangani panjang maks pada UITextField, ini memungkinkan kunci kembali untuk keluar dari pengunduran diri bidang teks sebagai responden pertama dan memungkinkan pengguna mundur ruang ketika mereka mencapai batas
sumber
Bagaimana dengan pendekatan sederhana ini. Ini bekerja dengan baik untuk saya.
Kemudian:
sumber
Jawaban lain tidak menangani kasus di mana pengguna dapat menempelkan string panjang dari clipboard. Jika saya tempel string yang panjang, itu hanya akan dipotong tetapi ditampilkan. Gunakan ini di delegasi Anda:
sumber
Dapatkan hingga 1 baris kode :)
Tetapkan delegasi tampilan teks Anda ke "diri" lalu tambahkan kode
<UITextViewDelegate>
.h dan kode berikut di file .m .... Anda dapat menyesuaikan angka "7" menjadi apa pun yang Anda inginkan dengan jumlah karakter MAKSIMUM Anda.Kode ini menjelaskan pengetikan karakter baru, menghapus karakter, memilih karakter kemudian mengetik atau menghapus, memilih karakter dan memotong, menempel secara umum, dan memilih karakter dan menempel.
Selesai!
Atau, cara keren lain untuk menulis kode ini dengan operasi bit adalah
sumber
Saya telah membuka sumber subclass UITextField, STATextField , yang menawarkan fungsi ini (dan banyak lagi) dengan
maxCharacterLength
propertinya.sumber
sekarang berapa banyak karakter yang Anda inginkan hanya memberikan nilai
sumber
Gunakan kode ini di sini RESTRICTED_LENGTH adalah panjang yang ingin Anda batasi untuk bidang teks.
sumber
Saya melakukan ini di Swift untuk batas 8 karakter saat menggunakan tombol angka.
Saya harus menguji untuk string! = "" Untuk memungkinkan tombol hapus untuk bekerja pada tombol angka, jika tidak, itu tidak akan memungkinkan menghapus karakter di bidang teks setelah mencapai maksimum.
sumber
Untuk Xamarin:
sumber
Saya telah menerapkan Ekstensi UITextField untuk menambahkan properti maxLength.
Ini didasarkan pada Xcode 6 IBInspectables, sehingga Anda dapat mengatur batas maxLength pada pembangun Antarmuka.
Berikut implementasinya:
sumber