Swift UITextField subclass handle text change programmatically

自古美人都是妖i 提交于 2020-01-14 07:32:10

问题


I have a subclass of UITextField that is specific to handle Date text. I have a tableviewcell that uses this text field:

let dateInput: DateTextField

Now the controller needs to initialize the text of the dateInput prior to display as follows:

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

Now, I want to be able to detect that the text changed from the subclass so that I can update the internal date variable so that is it in-sync with the text.

I implemented the textfield delegate methods but that just catches changes made by the user and not programmatically.


回答1:


You can override property and add didSet observer in your custom class:

class DateTextField: UITextField {

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



回答2:


My solution for this is to have each instance of the subclass maintain its own notification for UITextFieldDidChange and use a custom protocol to relay that information to the listener.

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




回答3:


Check the UIControlEventEditingChanged event...within it, you can set following logic.

Example from this post:

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


来源:https://stackoverflow.com/questions/35094710/swift-uitextfield-subclass-handle-text-change-programmatically

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!