La soluzione alla fine si è rivelata piuttosto banale. Sfortunatamente molte domande e risposte relative a questa domanda riguardano la convalida o la formattazione di valori numerici, non che controllano ciò che un utente può immettere.
La seguente implementazione del metodo delegato shouldChangeCharactersInRange è la mia soluzione. Come sempre, le espressioni regolari oscillano in questa situazione. RegExLib.com è un'ottima fonte per utili campioni o soluzioni RegEx. Non sono un guru RegEx e faccio sempre fatica a metterli insieme, quindi ogni suggerimento per migliorarlo è il benvenuto.
- (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;
}
Il codice sopra permette all'utente di inserire questi tipi di valori: 1, 1.1, 1.11, .1, .11. Si noti che questa implementazione non sostituisce la stringa del campo di testo, il che causerebbe una ricorsione. Questa soluzione rifiuta semplicemente il prossimo carattere che l'utente inserisce se "newString" non corrisponde alla regex.
funziona come un fascino! – Breakpoint
ciao! Grazie! la tua risposta è molto utile. Ma come disabilitare "." e ","?? – Frade
Frade, volevo che l'utente fosse in grado di usare ".". Dovresti essere in grado di impostare il keyboardType di textField su UIKeyboardTypeNumberPad. Questa tastiera non include la punteggiatura. – Seamus