Dengan Swift 5 dan iOS 12, coba penerapan textField(_:shouldChangeCharactersIn:replacementString:)
metode berikut yang merupakan bagian dari UITextFieldDelegate
protokol:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
- Bagian terpenting dari kode ini adalah konversi dari
range
( NSRange
) ke rangeOfTextToReplace
( Range<String.Index>
). Lihat tutorial video ini untuk memahami mengapa konversi ini penting.
- Untuk membuat kode ini bekerja dengan baik, Anda juga harus mengatur
textField
's smartInsertDeleteType
nilai UITextSmartInsertDeleteType.no
. Ini akan mencegah kemungkinan penyisipan ruang ekstra (yang tidak diinginkan) saat melakukan operasi tempel.
Kode contoh lengkap di bawah ini menunjukkan cara menerapkan textField(_:shouldChangeCharactersIn:replacementString:)
di UIViewController
:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard
override func viewDidLoad() {
super.viewDidLoad()
textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
textField.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
}
text.characters.count
tidak digunakan lagitext.count
Saya melakukannya seperti ini:
Kode bekerja untuk saya. Tapi saya bekerja dengan storyboard. Di Storyboard saya menambahkan tindakan untuk bidang teks di pengontrol tampilan saat mengedit diubah .
sumber
Pembaruan untuk Swift 4
sumber
Tambahkan lebih detail dari jawaban @Martin
sumber
Di Swift 4
Batas 10 karakter untuk bidang teks dan memungkinkan untuk menghapus (spasi mundur)
sumber
perubahan kecil untuk iOS 9
sumber
Cepat 3
sumber
Anda dapat memperluas UITextField dan menambahkan
@IBInspectable
objek untuk menanganinya:SWIFT 5
dan setelah itu definisikan pada inspektur atribut
Lihat Swift 4 Jawaban asli
sumber
Jika Anda ingin menimpa huruf terakhir:
sumber
Saya memposting solusi menggunakan
IBInspectable
, sehingga Anda dapat mengubah nilai panjang maksimal baik di pembuat antarmuka atau secara terprogram. Lihat disinisumber
Anda dapat menggunakan swift 5 atau swift 4 seperti gambar di bawah
tambahkan kode dalam tampilan ViewController
Anda dapat mengunduh GitHub dari Sumber Penuh: https://github.com/enamul95/TextFieldMaxLen
sumber
Waspadalah terhadap bug urung untuk UITextField yang disebutkan dalam posting ini: Setel panjang karakter maksimum dari UITextField
inilah cara Anda memperbaikinya dengan cepat
sumber
sumber
Saya telah menggunakan protokol / ekstensi ini di salah satu aplikasi saya, dan ini sedikit lebih mudah dibaca. Saya suka bagaimana ia mengenali ruang belakang dan secara eksplisit memberi tahu Anda ketika karakter adalah spasi mundur.
Beberapa hal yang perlu diperhatikan:
1. Apa pun yang mengimplementasikan, ekstensi protokol ini perlu menentukan batas karakter. Itu biasanya akan menjadi ViewController Anda, tetapi Anda dapat mengimplementasikan batas karakter sebagai properti yang dihitung dan mengembalikan sesuatu yang lain, misalnya batas karakter pada salah satu model Anda.
2. Anda harus memanggil metode ini di dalam metode delegasi shouldChangeCharactersInRange bidang teks Anda. Jika tidak, Anda tidak akan dapat memblokir entri teks dengan mengembalikan false, dll.
3. Anda mungkin ingin mengizinkan karakter spasi mundur lewat. Itu sebabnya saya menambahkan fungsi ekstra untuk mendeteksi ruang belakang. Metode shouldChangeCharacters dapat memeriksanya dan mengembalikan 'true' lebih awal sehingga Anda selalu mengizinkan spasi belakang.
Jika ada di antara Anda yang tertarik, saya memiliki repo Github di mana saya telah mengambil beberapa perilaku batas karakter ini dan memasukkannya ke dalam kerangka kerja iOS. Ada protokol yang dapat Anda terapkan untuk mendapatkan tampilan batas karakter seperti Twitter yang menunjukkan seberapa jauh Anda telah melampaui batas karakter.
Kerangka CharacterLimited di Github
sumber
Karena delegasi adalah hubungan 1-ke-1 dan saya mungkin ingin menggunakannya di tempat lain karena alasan lain, saya ingin membatasi panjang bidang teks dengan menambahkan kode ini dalam pengaturan mereka:
sumber
Saya menggunakan ini;
Batasi 3 karakter
sumber
Cepat 5
sumber
Anda perlu memeriksa apakah string yang ada ditambah input lebih besar dari 10.
sumber