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

问题描述 投票:0回答:4

我有一个

UITextField
的子类,专门用于处理日期文本。我有一个使用此文本字段的
tableviewcell

let dateInput: DateTextField

现在控制器需要在显示之前初始化

dateInput
的文本,如下所示:

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

现在,我希望能够检测到子类中的文本发生了更改,以便我可以更新内部日期变量,使其与文本同步。

我实现了文本字段委托方法,但它只是捕获用户所做的更改,而不是以编程方式进行的更改。

ios swift nsdate
4个回答
10
投票

您可以覆盖属性并在自定义类中添加

didSet
观察者:

class DateTextField: UITextField {

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

4
投票

我的解决方案是让子类的每个实例维护自己的通知

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


2
投票

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

来自this帖子的示例:

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

0
投票

现在做到这一点非常容易:

addTarget(self, action: #selector(userTyping), for: .editingChanged)

就是这样。

@objc func userTyping() {
    print("user is typing, text is now", text)
}
© www.soinside.com 2019 - 2024. All rights reserved.