Swift UITextField 子类以编程方式处理文本更改
Swift UITextField subclass handle text change programmatically
我有一个 UITextField
的子类,专门用于处理日期文本。我有一个使用此文本字段的 tableviewcell
:
let dateInput: DateTextField
现在控制器需要在显示之前初始化 dateInput
的文本,如下所示:
cell.dateInput.text = "01/29/2016"
现在,我希望能够检测到子类中的文本已更改,以便我可以更新内部日期变量,使其与文本同步。
我实现了文本字段委托方法,但它只是捕获用户所做的更改,而不是以编程方式。
检查 UIControlEventEditingChanged 事件...在其中,您可以设置以下逻辑。
示例来自 this post:
// Add a "textFieldDidChange" notification method to the text field control.
[textField addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
您可以覆盖 属性 并在您的自定义中添加 didSet
观察者 class:
class DateTextField: UITextField {
override var text: String? {
didSet {
// Do your stuff here
}
}
}
我的解决方案是让子类的每个实例维护自己的 UITextFieldDidChange
通知,并使用自定义协议将该信息转发给侦听器。
protocol MutableTextFieldDelegate {
func textChanged(_ sender:MutableTextField)
}
class MutableTextField : UITextField {
var textChangedDelegate : MutableTextFieldDelegate?
var previousValue : String?
override func awakeFromNib() {
super.awakeFromNib()
NotificationCenter.default.addObserver(forName: .UITextFieldTextDidChange, object: self, queue: nil) { [weak self] notification in
guard let strongSelf = self else { return }
guard let object = notification.object as? MutableTextField, object == strongSelf else { return }
if strongSelf.previousValue != strongSelf.text {
strongSelf.textChangedDelegate?.textChanged(strongSelf)
}
strongSelf.previousValue = strongSelf.text
}
}
}
swift5:NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification
...
我有一个 UITextField
的子类,专门用于处理日期文本。我有一个使用此文本字段的 tableviewcell
:
let dateInput: DateTextField
现在控制器需要在显示之前初始化 dateInput
的文本,如下所示:
cell.dateInput.text = "01/29/2016"
现在,我希望能够检测到子类中的文本已更改,以便我可以更新内部日期变量,使其与文本同步。
我实现了文本字段委托方法,但它只是捕获用户所做的更改,而不是以编程方式。
检查 UIControlEventEditingChanged 事件...在其中,您可以设置以下逻辑。
示例来自 this post:
// Add a "textFieldDidChange" notification method to the text field control.
[textField addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
您可以覆盖 属性 并在您的自定义中添加 didSet
观察者 class:
class DateTextField: UITextField {
override var text: String? {
didSet {
// Do your stuff here
}
}
}
我的解决方案是让子类的每个实例维护自己的 UITextFieldDidChange
通知,并使用自定义协议将该信息转发给侦听器。
protocol MutableTextFieldDelegate {
func textChanged(_ sender:MutableTextField)
}
class MutableTextField : UITextField {
var textChangedDelegate : MutableTextFieldDelegate?
var previousValue : String?
override func awakeFromNib() {
super.awakeFromNib()
NotificationCenter.default.addObserver(forName: .UITextFieldTextDidChange, object: self, queue: nil) { [weak self] notification in
guard let strongSelf = self else { return }
guard let object = notification.object as? MutableTextField, object == strongSelf else { return }
if strongSelf.previousValue != strongSelf.text {
strongSelf.textChangedDelegate?.textChanged(strongSelf)
}
strongSelf.previousValue = strongSelf.text
}
}
}
swift5:NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification
...