为什么我的标签在从 UITextField 更新 UILabel 时留下了 1 个字符?

Why my label left 1 character when updating UILabel from UITextField?

所以我正在从 UiTextfield(用户输入)进行 UILabel 实时更新。我正在使用此线程

中的代码

但不知何故,当我完全擦除 UITextField 中的文本时,我的 UILabel 总是留下一个字符。就像这里的 .gif http://g.recordit.co/SPQWnYtHJg.gif

而且好像总是少了一个字,如下图

这是我使用的代码

import UIKit

class CreateEventVC: UIViewController {

    @IBOutlet weak var eventNameTextField: UITextField!
    @IBOutlet weak var eventNameLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        //initial value
        eventNameLabel.text = " "

        // delegate declaration
        eventNameTextField.delegate = self
    }

}


extension CreateEventVC : UITextFieldDelegate {

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        eventNameLabel.text = eventNameTextField.text
        return true
    }
}

我最初怀疑是因为我在 viewDidload 中添加了这一行

eventNameLabel.text = " "

但是如果我删除这个,问题仍然存在

我该怎么办?

class CreateEventVC: UIViewController {

    @IBOutlet weak var eventNameTextField: UITextField!
    @IBOutlet weak var eventNameLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        //initial value
        eventNameLabel.text = " "

        eventNameTextField.addTarget(self, action: #selector(onTextFieldTextDidChange), for: .editingChanged)
    }


    @objc func onTextFieldTextDidChange() {

       eventNameLabel.text = eventNameTextField.text

    }

}

解释:

我们将目标添加到 eventNameTextField,每次更改 textField 文本时都会调用 onTextFieldTextDidChange 函数。

textField:shouldChangeCharactersIn:range:replacementString 在更改应用于文本字段之前调用,这允许您的应用否决请求并过滤掉不需要的内容。

问题是,您依赖于文本字段的文本。相反,您需要根据传递给委托的信息构建结果值并应用该值

也许更像...

extension CreateEventVC: UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let text = textField.text ?? ""
        eventNameLabel.text = (text as NSString).replacingCharacters(in: range, with: string)
        return true;
    }
}