Решение в итоге оказалось довольно тривиальным.К сожалению, многие вопросы и ответы, связанные с этим вопросом, касаются проверки или форматирования числовых значений, а не управления тем, что может ввести пользователь.
Следующая реализация метода делегата shouldChangeCharactersInRange является моим решением.Как всегда, регулярные выражения качаются в этой ситуации.RegExLib.com - отличный источник полезных примеров или решений RegEx.Я не гуру RegEx, и мне всегда трудно их собрать, поэтому любые предложения по его улучшению приветствуются.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField == self.quantityTextField)
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSString *expression = @"^([0-9]+)?(\\.([0-9]{1,2})?)?$";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression
options:NSRegularExpressionCaseInsensitive
error:nil];
NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString
options:0
range:NSMakeRange(0, [newString length])];
if (numberOfMatches == 0)
return NO;
}
return YES;
}
Приведенный выше код позволяет пользователю вводить следующие значения: 1, 1.11.11, .1, .11.Обратите внимание, что эта реализация не заменяет строку текстового поля, что может привести к рекурсии.Это решение просто отклоняет следующий символ, введенный пользователем, если 'newString' не соответствует регулярному выражению.