Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift UITextField subclass handle text change programmatically

Tags:

ios

swift

nsdate

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.

like image 715
Joe.b Avatar asked Jan 29 '16 21:01

Joe.b


2 Answers

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

class DateTextField: UITextField {

    override var text: String? {
        didSet {
           // Do your stuff here    
        }
    }   
}
like image 190
Konstantine Kalbazov Avatar answered Oct 05 '22 01:10

Konstantine Kalbazov


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

like image 28
James Webster Avatar answered Oct 05 '22 03:10

James Webster