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