Я понимаю, что это примерно на 4 года позже, но я просто наткнулся на ту же ерунду и подумал, что поделюсь, в чем проблема (или может быть), для потомков.
Оказывается,все методы доступа к значениям NSTextField (-objectValue
, -stringValue
, -doubleValue
и т. д.) в конечном итоге вызывают -validateEditing
.-validateEditing
, в свою очередь, использует присоединенный NSFormatter
для преобразования отредактированного текста в значение объекта, , а затем сбрасывает текст в поле с переформатированным значением .
Таким образом, если у вас есть какой-либо код, который наблюдает за полем, когда пользователь его редактирует, и вы «заглядываете» в значение в поле, вы случайно переформатируете и сбрасываете текст в текстовом поле.
Дело не в том, что текстовое поле не позволит вам ввести точку;это то, что текстовое поле уже содержит «3», и когда вы вводите точку, текст меняется на «3».Если затем у вас есть метод действия / уведомления / делегата, который выполняется всякий раз, когда что-то в поле изменяется, и вы вызываете любой из методов - type Value, значение «3».форматируется как «3», и это обновляет ячейку, стирая только что введенный вами период.
Мой хак состоял в том, чтобы избежать - type Value методов и заглянуть в объект NSText
, чтобыполучить отредактированный текст напрямую, не вызывая -validateEditing
:
// some method that runs every time the field changes...
NSTextField* valueField = self.valueField;
NSNumberFormatter* fieldFormatter = valueField.formatter;
NSText* fieldEditor = valueField.currentEditor;
id newValue = ( fieldEditor!=nil ? [fieldFormatter numberFromString:fieldEditor.string] : valueField.objectValue );