Swift: Apakah ada metode ketika seseorang mengetuk tombol pada keyboard?

Apakah ada metode yang dapat saya gunakan ketika ada tombol pada keyboard yang diketuk pada keyboard yang memasukkan input ke dalam kolom teks di Swift? Bagaimana cara melakukan sesuatu (Misalnya menampilkan gambar di tampilan kanan UITextField) ketika kunci apa pun yang memasukkan input ke UITextField (Tidak termasuk, misalnya, tombol seperti caps lock dan tombol emoji/alih bahasa) diketuk?


person Joe N    schedule 22.02.2019    source sumber
comment
Sudahkah Anda memeriksa UITextFieldDelegate?   -  person Alexander    schedule 22.02.2019


Jawaban (6)


Anda dapat melakukannya dengan sangat mudah

Ini kodenya:

extension ViewController : UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        let userImageView = UIImageView(image: UIImage(named: "user"))
        userImageView.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
        self.txtField.rightViewMode = .always

        if let textFieldValue = textField.text,
            let textFieldRange = Range(range, in: textFieldValue) {
            let newText = textFieldValue.replacingCharacters(in: textFieldRange, with: string)
            if newText == "" {
                textField.rightView = nil
            } else {
                textField.rightView = userImageView
            }
        }
        return true

    }
}

Keluaran:

masukkan deskripsi gambar di sini

Jika Anda menghadapi kesulitan dalam hal ini, harap beri tahu saya.

person iOS Team    schedule 22.02.2019
comment
@JoeN jawaban yang sama diberikan 30 menit sebelum jawaban ini. Saya tidak mengerti mengapa Anda belum menerima jawaban saya??? - person Jarvis The Avenger; 25.02.2019

Keyboard umumnya akan muncul dalam kasus UITextfield dan UITextView coba gunakan delegasi yang disebutkan di bawah.

Jadi, dalam kasus UITextField

- (BOOL)textField:(UITextField *)textField
          shouldChangeCharactersInRange:(NSRange)range
          replacementString:(NSString *)string {

    // Do something here...
}

Saat Anda menggunakan keyboard Dalam Kasus UITextView :

- (BOOL)textView:(UITextView *)textView
      shouldChangeTextInRange:(NSRange)range 
      replacementText:(NSString *)text {

    // Do something here...
}

Ingat ini, setiap kali pengguna memasukkan beberapa karakter atau menekan beberapa tombol di keyboard, metode ini akan memanggil dan Anda akan mengetahui teks yang dia pilih dari keyboard.

person Hairsh Kuramsetty    schedule 22.02.2019
comment
Pertanyaannya diberi tag Swift, bukan Objective-C. - person rmaddy; 22.02.2019
comment
Apakah ada cara agar Anda, orang lain, dapat memasukkan ini ke dalam Swift? - person Joe N; 22.02.2019
comment
@JoeN Tidak ada apa pun di sini yang tidak dapat Anda lihat hanya dengan melihat dokumentasi referensi untuk UITextFieldDelegate dan UITextViewDelegate. - person rmaddy; 22.02.2019

Anda dapat menggunakan delegasi ini untuk mengontrolnya:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

   // String 键盘上新输入的字符,“”代表删除

    //返回true会添加进去,返回false会忽略掉
    return true
}
person Dandelion    schedule 22.02.2019
comment
Perhatikan juga bahwa ini dapat dipanggil jika pengguna tidak mengetuk tombol seperti saat pengguna melakukan potong atau tempel. - person rmaddy; 22.02.2019
comment
Ya, Itu hanya merespons kode yang akan dimasukkan ke kendali Anda - person Dandelion; 22.02.2019
comment
Dengan kondisi ini, menurut saya hanya membuat inputView khusus (tampilan keyboard) yang dapat memenuhi persyaratan - person Dandelion; 22.02.2019
comment
Setengahnya berhasil. RightView tidak akan hilang sekarang bahkan setelah saya memundurkan semua yang saya ketik. - person Joe N; 22.02.2019

ya, Anda dapat melakukannya dengan menambahkan addTarget di viewDidLoad

override func viewDidLoad() {
    // do your works
    self.yourtextfield.addTarget(self, action: #selector(textFieldChanged), for: .editingChanged)
}

@objc func textFieldChanged() {
     // do your work here 
}

Apa itu addTarget?

Mengaitkan objek target dan metode tindakan dengan kontrol.

Anda menuliskan addTarget dengan tindakan yang Anda inginkan (yaitu mengedit perubahan, bidang teks mulai mengedit, atau mengakhiri pengeditan) dan metode pemilih terkait, ketika kontrol dipanggil (di sini pengeditan berubah), metode pemilih ini akan dipanggil dan Anda dapat menanganinya kode apa yang Anda inginkan mengenai kontrol

person Ankur Lahiry    schedule 22.02.2019

Anda dapat melakukannya dengan dua cara:

  1. Delegasi UITextField

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
       // Observer changes in text....
       return true
    }
    
  2. Mekanisme Target-Tindakan:

Di viewDidLoad Anda, tambahkan kode berikut:

self.textfield.addTarget(self, action: #selector(textFieldTextChanged), for: .editingChanged)

Dan menerapkan metode:

@objc func textFieldTextChanged() {
     print(self.textfield.text!)
}

Diperbarui:

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
     let rightView = UIView(frame: CGRect(x: -10, y: 0, width: 20, height: 20))

    override func viewDidLoad() {
        super.viewDidLoad()
        rightView.backgroundColor = .red
        textField.rightView = rightView
        textField.rightViewMode = .always
    }


}

extension ViewController : UITextFieldDelegate {
    func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool {

        if let text = textField.text, let textRange = Range(range, in: text) {
            let updatedText = text.replacingCharacters(in: textRange, with: string)

            if updatedText == "" {
                textField.rightView = nil
            } else {
                textField.rightView = rightView
            }

        }
        return true
    }

}
person Jarvis The Avenger    schedule 22.02.2019
comment
Oke. Saya menggunakan yang pertama. Ini hampir berfungsi kecuali ketika saya menekan backspace. Tombol hapus masih ada. Bagaimana cara menghilangkannya ketika saya telah mengatur ulang semuanya? - person Joe N; 22.02.2019
comment
tombol hapus yang mana?? bisakah Anda menambahkannya ke pertanyaan Anda?? - person Jarvis The Avenger; 22.02.2019
comment
Oh maaf saya lupa bilang, gambar yang ditampilkan di rightView terlihat seperti tombol hapus. - person Joe N; 22.02.2019
comment
1. Anda berfungsi tetapi ketika saya menekan backspace dan menghapus semua yang ada di bidang teks, saya juga ingin menghilangkan rightView. - person Joe N; 22.02.2019
comment
@JoeN maka Anda hanya perlu menambahkan metode check-in itu ketika teks bidang teks Anda kosong. Saya rasa Anda hanya perlu mengamati urutannya dan saya yakin Anda akan mendapatkannya. - person Jarvis The Avenger; 22.02.2019
comment
@JoeN periksa pertanyaan ini: stackoverflow .com/questions/51894973/ - person Jarvis The Avenger; 22.02.2019
comment
@JoeN jika Anda bisa mendapatkan acara backspace, akan mudah untuk memeriksa kapan teks bidang teks Anda diterima dan karenanya hapus saja tampilan kanan Anda. - person Jarvis The Avenger; 22.02.2019
comment
tidak ada solusinya?? - person Joe N; 22.02.2019
comment
@JoeN periksa solusinya - person Jarvis The Avenger; 22.02.2019

Solusi saya untuk tombol hapus khusus:

Tambahkan saja ini di luar kelas Anda

extension ViewController: UITextFieldDelegate {

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let clearButton = UIImageView(frame:
        CGRect(x: 7, y: 7, width: 16, height: 16))
    clearButton.image = #imageLiteral(resourceName: "Clear")

    let iconContainerView: UIView = UIView(frame:
        CGRect(x: 0, y: 0, width: 37, height: 30))
    iconContainerView.addSubview(clearButton)
    iconContainerView.tintColor = #colorLiteral(red: 0.5568627451, green: 0.5568627451, blue: 0.5764705882, alpha: 1)

    textField.rightView = iconContainerView
    textField.rightViewMode = .whileEditing

    if let textFieldValue = textField.text, let textFieldRange = Range(range, in: textFieldValue) {
        let newText = textFieldValue.replacingCharacters(in: textFieldRange, with: string)
        if newText == "" {
            textField.rightView = nil
        } else {
            textField.rightView = iconContainerView
        }
    }

    return true

    }
}
person Joe N    schedule 23.02.2019