Ich habe für meine iPhone App nach einer Möglichkeit gesucht in einem UITextField die Anzahl der Zeichen und die möglichen Zeichen zu beschränken damit der Benutzer nur Ganzzahlen und Fließkommazahlen mit einer bestimmten Länge in ein Textfeld eintragen kann.
Die Suche im Internet war nicht ganz so ergiebig, eine Lösung für die Beschränkung der Länge habe ich gefunden, die auch etwas modifiziert so in der Lösung enthalten ist, die Zeichenbeschränkungen waren aber eher suboptimal, z.B. in einer switch-Abfrage alle Zahlen von 0-9 abfragen.
Schlussendlich habe ich dann aus einigen Lösungen meine unten aufgeführte zusammengebaut, die ich für relativ gut halte, geht bestimmt besser, aber es funktioniert und ist nachvollziehbar.
- (BOOL)textField:(UITextField *)textField
textFieldshouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string;
…ist eine Methode aus dem UITextFieldDelegate Protokoll und wird jedes mal aufgerufen wenn ein Taste angeschlagen wird. Damit es funktioniert muss die Klasse, die diese Methode implementiert das UITextFieldDelegate Protokoll einbinden und das betreffende TextField muss das Objekt über seine Delegate-Property kennen.
#define MAX_LENGTH 6
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
BOOL validLength;
BOOL validCharacters;
if (textField.text.length >= MAX_LENGTH && range.length == 0) {
validLength = NO;
} else {
validLength = YES;
}
NSCharacterSet *cSet = nil;
char character;
/* Die if-Abfrage dient dazu zu vermeiden, dass bei Druck auf Delete
characterAtIndex:0 aufgerufen wird und damit eine Exception
geworfen wird */
if (range.length == 0) {
cSet = [NSCharacterSet decimalDigitCharacterSet];
character = [string characterAtIndex:0];
}
/* Schauen, ob der eingebene String
eine Zahl, ein Komma oder ein Punkt ist
oder ob Delete gedrückt wurde */
if ([cSet characterIsMember:character] ||
[string isEqual:@","] ||
[string isEqual:@"."] ||
range.length == 1) {
validCharacters = YES;
} else {
validCharacters = NO;
}
/* Wenn Länge und Zeichen zulässig sind
wird YES zurückgegeben und der Tastenanschlag erscheint
im TextField sonst nicht */
if (validLength && validCharacters) {
return YES;
} else {
return NO;
}
return YES; /* Wenn etwas schief gegangen sein sollte,
wird YES zurückgegeben und der Tastenanschlag
wird angenommen */
}
{ Tags: Delegate, Development, einschränken, iPhone, limitieren, objC, objective c, UITextField }
