NSNumberFormatter не позволяет вводить десятичные числа - PullRequest
9 голосов
/ 14 июня 2011

Я совершенно сбит с толку, используя NSNumberFormatter.Это должно быть очень просто, но я не могу заставить его работать.

Я хотел бы установить NSTextField, чтобы позволить вводить десятичные числа, с десятичной точкой или без.Вот что, я думаю, сработает:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumFractionDigits:0];
[formatter setMaximumFractionDigits:4];
[formatter setAllowsFloats:YES];
[[timeFlowMultiplierTF cell] setFormatter:formatter];

Однако при вводе текста в текстовом поле нажатие клавиши «точка» для десятичной точки не приводит к ее получению.Набрав «3.14», вы получите «314».Ввод [formatter setAlwaysShowsDecimalSeparator: YES] первоначально правильно отформатирует число, но если я наберу его поверх, я снова не смогу набрать десятичную точку.

Что мне здесь не хватает?Вы могли бы подумать, что это будет действительно просто

Ответы [ 2 ]

11 голосов
/ 24 октября 2015

Я понимаю, что это примерно на 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 );
1 голос
/ 12 июля 2016

Спасибо и следуя ответу @James Bucanek: вот реализация Swift, которую я использовал, когда перебирал controlTextDidChange метод делегирования, который разблокировал пользователя от ввода десятичной точки. Он также обновляет флаг enabled кнопки на интерфейсе в соответствии с тем, есть ли допустимая (то есть строка с нулевой и ненулевой длиной) запись:

override func controlTextDidChange(notification: NSNotification) {
            if let formatter: NSNumberFormatter? = self.user_textfield.formatter as? NSNumberFormatter {
                if let field_editor: NSText = self.user_textfield.currentEditor() {
                    if let new_value: Float? = formatter!.numberFromString(field_editor.string!)?.floatValue {
                        self.my_button_out.enabled = new_value > 0.0
                    } else {
                        self.my_button_out.enabled = false
                    }
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...