Local Links

External Links

Contact

Search this site

iOS: Implementing TextField input filters correctly


- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range

  replacementString:(NSString *)string;

Wenn ihr einen Filter für TextField-Eingaben programmieren wollt, dann ist es grundsätzlich FALSCH, wenn ihr dazu den replacementString auf erlaubte Zeichen untersucht.

Falsch ist das deswegen, weil es mehrere Sonderfälle gibt, die von solchen Tests nicht abgedeckt werden, z.B. die Backspace-Taste. Auch Eingaben, die über ein echtes Keyboard gemacht werden können, haben hier schon Probleme gehabt. Auch das Einfügen vom Clipboard kann da Probleme haben.

Die korrekte Methode ist stattdessen diese:

1. Man nimmt den replacementString lediglich dazu her, daraus die neue Eingabe zu bauen. Das geht so:

NSString *resultString = [textField.text stringByReplacingCharactersInRange:range withString:string];

Nun untersucht mal DIESEN resultString darauf, ob er nur die erlaubten Zeichen enthält. Für Zahlen geht das i.d.R. mit einer Util-Funktion von uns:

    NSString *newString = [NDNumberStringUtil reformattedNumber:resultString usingFormatter:formatter];
    return newString != nil;

Also, achtet bitte hierauf. Ich sehe leider noch zu viele Monster-Funktionen, die deswegen unnötig lang, unübersichtlich und damit auch fehleranfällig sind.

Page last modified on 2011-08-25, 13:30 UTC (do)
Powered by PmWiki