Я обнаружил, что shouldChangeCharactersInRange запирает всплывающую клавиатуру, клавишу возврата и кнопку «Готово». Я обнаружил, что если я обработал строки 0 длины и разрешил управляющие символы, он работал нормально.
Мне не нравится использовать 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 может анализировать ввод пользователя и предупреждать, если не может; тем не менее, это приятнее, когда можно вводить только законные символы.