Swift UITextField子类以编程方式处理文本更改

我有一个特定的处理date文本的UITextField的子类。 我有一个tableviewcell使用这个文本字段:

 let dateInput: DateTextField 

现在控制器需要在显示之前初始化dateInput的文本,如下所示:

 cell.dateInput.text = "01/29/2016" 

现在,我想能够检测到文本从子类更改,以便我可以更新内部datevariables,以便它与文本同步。

我实现了textfield委托方法,但只捕获用户所做的更改,而不是以编程方式。

您可以覆盖属性,并在您的自定义类中添加didSet观察者:

 class DateTextField: UITextField { override var text: String? { didSet { // Do your stuff here } } } 

检查UIControlEventEditingChanged事件…在其中,您可以设置以下逻辑。

来自此post的示例:

 // Add a "textFieldDidChange" notification method to the text field control. [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 

我的解决scheme是让每个子类的实例维护自己的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 } } }