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: , , , , , , , }

Kommentar schreiben: