簡體   English   中英

Swift UITextField子類以編程方式處理文本更改

[英]Swift UITextField subclass handle text change programmatically

我有一個UITextField的子類,專門用於處理Date文本。 我有一個使用此文本字段的tableviewcell

let dateInput: DateTextField

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

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

現在,我希望能夠檢測到從子類更改的文本,以便我可以更新內部日期變量,以便它與文本同步。

我實現了textfield委托方法,但只捕獲用戶所做的更改,而不是以編程方式。

您可以覆蓋屬性並在自定義類中添加didSet觀察者:

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

檢查其中的UIControlEventEditingChanged事件...,您可以設置以下邏輯。

這篇文章的例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM