Frage

Ich habe eine UITextField in meiner Anwendung. Ich mag den Satz von Zeichen beschränken, die in das Feld auf einen Satz eingegeben werden können kann, die ich definiert haben. Ich konnte die Zeichen filtert in das Feld eingegeben werden, wenn der Text der UITextFieldDelegate Methode verpflichtet, mit:

- (BOOL)textFieldShouldReturn:(UITextField*)textField

Allerdings gibt das dem Benutzer einen falschen Eindruck, als wenn auch eingeschränkte Zeichen aus dem Endwert entfernt werden, wurden sie noch sichtbar in das Textfeld eingegeben vor dem Drücken von Return / done / etc. Was ist der beste Ansatz, die ein eingeschränktes Zeichen in dem Textfeld erscheint verhindern würden, wie sie auf der Tastatur ausgewählt werden?

Hinweis: I unter der Annahme bin Betrieb, die ich wenig Kontrolle über die Schlüssel, die von der iPhone-Tastatur versehen sind (s). Ich bin mir bewusst, dass ich zwischen verschiedenen Tastatur-Implementierungen aber bin unter dem Eindruck wechseln, die ich nicht bestimmte Tasten deaktivieren. Diese Annahme ist möglicherweise falsch.

War es hilfreich?

Lösung

Blick auf textField:shouldChangeCharactersInRange

Diese Methode wird von der UITextFieldDelegate aufgerufen, wenn neue Zeichen eingegeben werden, oder vorhandene Zeichen werden aus dem Textfeld gelöscht. Sie konnten keine Rückkehr zu nicht um die Änderung zu ermöglichen.

Andere Tipps

Ich tat, wie marcc vorgeschlagen und es hat gut funktioniert. Beispielimplementierung folgt.

Hinweis: Variablennamen der Kürze halber ausgewählt wurden und nicht die Coding-Standards widerspiegeln:

    ...
    myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"xyzXYZ"];
    ...
}

- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered {
    for (int i = 0; i < [textEntered length]; i++) {
        unichar c = [textEntered characterAtIndex:i];
        if (![myCharSet characterIsMember:c]) {
            return NO;
        }
    }
    return YES;
}

Dies ist eines der saubersten Ansätze Zeichen in einem UITextField eingegeben zu beschränken. Dieser Ansatz ermöglicht die Verwendung von mehreren vordefinierten NSCharacterSets.

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    NSMutableCharacterSet *allowedCharacters = [NSMutableCharacterSet alphanumericCharacterSet];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]];

    if([string rangeOfCharacterFromSet:allowedCharacters.invertedSet].location == NSNotFound){

        return YES;

    }

    return NO;

}

Sehen Sie sich die UITextViewDelegate Methode - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string.

Es ist genau das, was Sie brauchen.

Dies ist, was ich verwende, um die Benutzer zu beschränken A-Z in Großbuchstaben. Stellen Sie die regex Variable nach Geschmack:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString* regex = @"[^A-Z]";
    return ([string rangeOfString: regex
                      options:NSRegularExpressionSearch].location == NSNotFound);
};

Wie wäre das?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString* regex = @"[^a-z]";
    return ([[string lowercaseString] rangeOfString: regex
                      options:NSRegularExpressionSearch].location == NSNotFound);
};

Hinweis:

Ich mache alle Zeichen Fall [string lowercaseString] zu senken, so dass Sie nicht für captial / Kleinbuchstaben in regex schreiben müssen.

Sie könnten Schleife und Kontrolle halten, wenn die UITextField.text Eigenschaft geändert wird, sobald die DidBeginEditing Methode aufgerufen wird. Wenn ja, den Text überprüfen und ein schlechtes Zeichen entfernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top