为什么我的标签在从 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;
}
}
所以我正在从 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;
}
}