Я обнаружил, что shouldChangeCharactersInRange также закручивает всплывающую клавиатуру, возврат и кнопку «Готово». Я обнаружил, что если я обрабатывал строки нулевой длины и разрешал управляющие символы, все работало нормально.
Мне не нравится использовать NSNumberFormatter, потому что он настаивает на том, чтобы число было правильно сформировано на всех этапах, пока пользователь редактирует, и это может привести в ярость, если вы, скажем, хотите иметь две десятичные точки в номере на мгновение, пока вы не удалите тот, что не в том месте.
Вот код, который я использовал:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([string length] < 1) // non-visible characters are okay
return YES;
if ([string stringByTrimmingCharactersInSet:[NSCharacterSet controlCharacterSet]].length == 0)
return YES;
return ([string stringByTrimmingCharactersInSet:[self.characterSet invertedSet]].length > 0);
}
Где self.characterSet содержит допустимые символы, я использовал этот метод для создания его для валюты:
- (NSCharacterSet *)createCurrencyCharacterSet
{
NSLocale *locale = [NSLocale currentLocale];
NSMutableCharacterSet *currencySet = [NSMutableCharacterSet decimalDigitCharacterSet];
[currencySet addCharactersInString:@"-"]; // negative symbol, can't find a localised version
[currencySet addCharactersInString:[locale objectForKey:NSLocaleCurrencySymbol]];
[currencySet addCharactersInString:[locale objectForKey:NSLocaleGroupingSeparator]];
[currencySet addCharactersInString:[locale objectForKey:NSLocaleDecimalSeparator]];
return [[currencySet copy] autorelease];
}
Несколько неудачный код [[currencySet copy] autorelease]
возвращает неизменный NSCharacterSet.
Использование [NSCharacterSet decimalDigitCharacterSet]
также включает в себя индийские и арабские эквивалентные символы, что, надеюсь, означает, что люди, использующие эти языки, могут использовать цифры своего алфавита для ввода чисел.
По-прежнему необходимо проверить, может ли NSNumberFormatter анализировать ввод пользователя и предупреждать, если он не может; тем не менее, когда можно вводить только допустимые символы, это дает больше удовольствия.
person
Ben Golding
schedule
10.02.2011