Цель-C: Как использовать оба "." и "," как десятичный разделитель или, по крайней мере, преобразовывать один в другой на лету - PullRequest
1 голос
/ 20 августа 2010

У меня есть экземпляр NSTextField, например someTextField, для которого я буду использовать числовой форматер, чтобы ограничить ввод только цифрами.

Проблема связана с локализацией в сочетании с конкретными используемыми раскладками клавиатуры.

Я хотел бы разрешить, скажем, американским и европейским пользователям вводить свои локализованные десятичные разделители. Как вы все знаете, в США это будет ., а для большей части Европы - , (и аналогично разделителю тысяч и т. Д., Но давайте пока отложим это).

Итак, я написал следующее задание: [numberFormatter setLocale:[NSLocale currentLocale]]; для экземпляра NSNumberFormatter.

Проблемы возникают, когда пользователь, у которого , установлен в качестве десятичного разделителя И включена раскладка клавиатуры США (довольно распространенная в Европе), нажимает клавишу десятичного разделителя на цифровой клавиатуре. При раскладке американской клавиатуры это даст ему . в качестве десятичного разделителя, но в то же время он будет проигнорирован в someTextField из-за локализованных настроек для всей системы. Таким образом, если вы хотите набрать 1/2 только с цифровой клавиатуры, вы наберете 0.5 (раскладка клавиатуры США) в текстовом поле, и система будет читать ее как 0, поскольку она распознает только , в качестве десятичного разделителя. Так работает программа в настоящее время, и я хотел бы улучшить ее в этом отношении.

Я бы хотел, чтобы пользователь мог ввести . в someTextField и чтобы система распознала его как десятичный разделитель, как это было бы ,. Такое поведение можно увидеть в собственном приложении Apple Calculator. Если вы наберете . на цифровой клавиатуре, он сразу появится на экране как , (для всех условий, как описано ранее).

Вопрос: могу ли я достичь этого, используя экземпляр NSNumberFormatter? Если нет, возможно ли установить на лету преобразование вывода десятичной разделительной клавиши с цифровой клавиатуры в общесистемный набор десятичных разделителей? Или, может быть, у вас есть другие предложения?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 августа 2010

Посмотрите на протокол UITextFieldDelegate. Это позволяет вашему текстовому полю спрашивать своего делегата, должен ли он принимать символ, который только что набрал пользователь. Соответствующий метод будет textField: shouldChangeCharactersInRange: replaceString. Если рассматриваемый символ - или. просто позвольте делегату добавить правильно локализованный десятичный разделитель «вручную» и вернуть NO.

Я не совсем уверен, сработает ли это, если текстовое поле установлено в числовой режим, возможно, входные данные фильтруются до вызова метода делегата, что приводит к тому, что метод не вызывается, если «неправильный» разделитель был отфильтрован ранее. Если это так, вы можете оставить текстовое поле в буквенно-цифровом режиме и снова использовать метод делегата, чтобы отфильтровать все, что не является числами или разделителями. Однако в этом случае вы должны убедиться, что пользователю не разрешено вводить более одного десятичного разделителя - либо игнорируйте лишние, либо удалите первый и примите новый.

0 голосов
/ 20 августа 2010

У меня нет конкретного ответа на ваш вопрос, но я бы сказал, что правильный подход - это вообще не копаться с NSNumberFormatter и сосредоточиться на попытке изменить символы, генерируемые клавиатурой.

Языковой стандарт по умолчанию для форматеров чисел обычно является системным языковым стандартом по умолчанию, заданным пользователем в настройках интернационализации.Если вы измените это поведение программно для элементов пользовательского интерфейса, вы фактически скажете пользователю: «Я лучше вас знаю, как вы хотите вводить числа».Подобное высокомерие со стороны разработчика никогда не дает им хороших оценок в отношении дизайна пользовательского интерфейса.

Фактически, вы можете применить тот же аргумент для переназначения кнопки точки на цифровой клавиатуре.Откуда вы знаете, что пользователь не установил раскладку клавиатуры США , потому что позволяет ему получить точку от этой клавиши?Возможно, они считают более важным иметь возможность вводить разделитель тысяч с клавиатуры, а не десятичный разделитель.Я не говорю, что вы не должны реализовывать вашу функцию, просто убедитесь, что пользователь имеет контроль над тем, когда она включена или отключена.1011 * keyDown событие в элементе управления.Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...