I'm trying to use an NSTextField for integer user input. The text field is bound to an NSNumber property and in the setter method I cleanup the input value (make sure it's an int) and set the property if necessary. I send the willChangeValueForKey: and didChangeValueForKey:, but the UI doesn't update to the new values while that text field is still active.
So for example I can type "12abc" in the text field that the setter method cleans up to "12", but the text field still shows "12abc".
I have "Continuously Update Value" checked in the interface builder.
(I've also noticed that the setter method receives an NSString, not an NSNumber. Is that normal?)
What's the correct way of hooking up an NSTextField to an NSNumber? What does the setter method look like for the property? How to prevent non-numeric values from showing up in the text field?
Best Answer
There are very few reasons to send those messages. Usually, you can do the same job better and more cleanly by implementing and using accessors (or, better yet, properties). KVO will send the notifications for you when you do that.
In your case, you want to either reject or filter bogus inputs (like “12abc”). The correct tool for this task is Key-Value Validation.
To enable this, check the “Validates Immediately” box on the binding in IB, and implement a validation method.
Filtering:
Rejecting:
Yes, unless you use a value transformer that transforms strings into numbers, connect a number formatter to the
formatter
outlet, or substitute an NSNumber for the NSString in your validation method.