Rozwiązanie ostatecznie okazało się dość banalne. Niestety, wiele pytań i odpowiedzi związanych z tym pytaniem dotyczy sprawdzania poprawności lub formatowania wartości liczbowych, a nie jakimi użytkownik mógłby wprowadzić dane.
Następujące wdrożenie metody delegatów shouldChangeCharactersInRange jest moim rozwiązaniem. Jak zwykle, wyrazy regularne kołyszą się w tej sytuacji. RegExLib.com jest doskonałym źródłem przydatnych próbek lub rozwiązań RegEx. Nie jestem guru RegEx i zawsze staram się je trochę połączyć, więc wszelkie sugestie, aby to poprawić, są mile widziane.
- (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;
}
Powyższy kod umożliwia użytkownikowi wprowadzenie tego rodzaju wartości: 1, 1.1, 1.11, .1, .11. Zauważ, że ta implementacja nie zastępuje łańcucha pola tekstowego, co spowodowałoby rekursję. To rozwiązanie po prostu odrzuca następny znak wprowadzany przez użytkownika, jeśli "newString" nie pasuje do wyrażenia regularnego.
działa jak marzenie! – Breakpoint
cześć! dzięki! twoja odpowiedź jest bardzo przydatna. Ale jak wyłączyć "." i ","?? – Frade
Frade, chciałem, aby użytkownik mógł korzystać z ".". Powinieneś być w stanie ustawić parametr keyboardType of textField na UIKeyboardTypeNumberPad. Ta klawiatura nie zawiera interpunkcji. – Seamus