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

时间:2018-04-14 23:50:07

标签: ios swift uitextfield uilabel

所以我正在从UiTextfield(用户输入)进行UILabel实时更新。我正在使用此帖子中的代码Swift3: Live UiLabel update on user input

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

一样

似乎总有一个角色丢失,如下图所示

enter image description here

enter image description here

这是我使用的代码

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 = " "

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

我该怎么办?

2 个答案:

答案 0 :(得分:1)

在将更改应用于文本字段之前调用

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;
    }
}

答案 1 :(得分:0)

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

    }

}

说明:

我们将target添加到eventNameTextField,每次更改textField文本时都会调用onTextFieldTextDidChange func。