Apakah ada sesuatu seperti textFieldDidChange yang tersedia di Xcode 12 yang akan berjalan di versi iOS lebih awal dari 13?

Saya menggunakan fungsi ini untuk membaca konten UITextField setiap kali berubah:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard CharacterSet(charactersIn: "0123456789").isSuperset(of: CharacterSet(charactersIn: string)) else {
        return false
    }
    let s: String = textField.text ?? ""
    print("s  = \(s)")
    
    return true
}

Tetapi hasil cetakan selalu tertinggal satu karakter.

Sebagai contoh: Ketika saya mengetik 1 output yang dicetak adalah s = ". Menambahkan 2 (bidang teks sekarang menampilkan 12) mencetak s = 1. Setelah 3 (bidang teks sekarang berisi 123), s = 12. Dan seterusnya. Selalu satu karakter di belakang.

Kenapa ini? (Saya menduga karena karakter tidak menjadi bagian dari textfield.text sampai fungsi mengembalikan nilai true.)

Ini mendapatkan isinya:

func textFieldDidChangeSelection(_ textField: UITextField) {
    let s: String = textField.text ?? ""
    print("s = \(s)")
}

Tetapi hanya berfungsi dengan iOS 13.x.

Bagaimana cara mendapatkan konten UITextfield setiap kali berubah untuk versi iOS apa pun?

0
Greg 10 Januari 2021, 22:05

3 jawaban

Jawaban Terbaik

Kenapa ini? (Saya menduga karena karakter tidak menjadi bagian dari textfield.text sampai fungsi mengembalikan nilai true.)

Benar, itu juga mengapa metode itu memiliki "harus" dalam namanya - Anda dapat memveto perubahan itu dengan mengembalikan false.

Gunakan kode seperti ini

guard let text = textField.text as NSString? else {
    return false
}

let newText = text.replacingCharacters(in: range, with: string)

Untuk mendapatkan "pratinjau" tentang konten bidang jika Anda benar-benar mengizinkan perubahan terjadi dengan mengembalikan true

1
Gereon 11 Januari 2021, 16:31

Ya itu benar karakter tidak menjadi bagian dari textfied.text sampai Anda mengembalikan true fungsi itu

Jika Anda ingin mendapatkan semua karakter di bidang teks, sebaiknya Ubah Karakter coba yang ini

let oldText = textField.text!
let r = Range(range, in: oldText)
let text = oldText.replacingCharacters(in: r, with: string)
1
Havel 11 Januari 2021, 16:23

Jika Anda menambahkan UITextField di Storyboard, Anda dapat menambahkan @IBAction untuk acara Editing Changed:

@IBAction func textFieldChanged(_ sender: Any) {
    guard let tf = sender as? UITextField else { return }
    let s: String = tf.text ?? ""
    print("s = \(s)")
}

Jika Anda ingin menambahkannya melalui kode, tambahkan tindakan - Anda mungkin akan melakukannya di viewDidLoad():

    myTextField.addTarget(self, action: #selector(self.myTextFieldChanged(_:)), for: .editingChanged)

Dan tambahkan fungsi ini ke pengontrol Anda:

@objc func myTextFieldChanged(_ sender: Any) {
    guard let tf = sender as? UITextField else { return }
    let s: String = tf.text ?? ""
    print("s = \(s)")
}
0
DonMag 11 Januari 2021, 16:05