2009-06-18 15 views
11

Ich habe ein UITextField in meiner Anwendung. Ich möchte die Menge der Zeichen, die in das Feld eingegeben werden können, auf ein Set beschränken, das ich definiert habe. Ich konnte filtern die Zeichen in das Feld eingegeben werden, wenn der Text die UITextFieldDelegate Methode verpflichtet, mit:Filtern von Zeichen eingegeben in einem UITextField

- (BOOL)textFieldShouldReturn:(UITextField*)textField 

Doch dies gibt dem Benutzer einen falschen Eindruck, als wenn auch eingeschränkte Zeichen aus dem Endwert entfernt werden, sie waren noch sichtbar in das Textfeld eingegeben, bevor Sie Return/Done/etc drücken. Was ist der beste Ansatz, um zu verhindern, dass eingeschränkte Zeichen im Textfeld angezeigt werden, wenn sie auf der Tastatur ausgewählt sind?

Hinweis: Ich gehe davon aus, dass ich wenig Kontrolle darüber habe, welche Tasten die iPhone-Tastatur (en) zur Verfügung stellen. Mir ist bewusst, dass ich zwischen verschiedenen Tastatur-Implementierungen wechseln kann, habe aber den Eindruck, dass ich bestimmte Tasten nicht deaktivieren kann. Diese Annahme ist möglicherweise falsch.

Antwort

13

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 könnten NEIN senden, um die Änderung nicht zuzulassen.

+2

Beispielcode zu dieser Antwort finden Sie hier: http://stackoverflow.com/questions/1013647/filtering-characters-enter-into-a-uituxfield/1015262#1015262 – teabot

+2

Nice Job URL zu Ihrer Antwort hinzufügen, die ist direkt unter diesem. +1 – uerceg

2

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

Es ist genau das, was Sie brauchen.

-6

Sie könnten eine Schleife erstellen und überprüfen, ob die UITextField.text -Eigenschaft geändert wurde, sobald die DidBeginEditing-Methode aufgerufen wird. Wenn dies der Fall ist, überprüfen Sie den Text und entfernen Sie ein ungültiges Zeichen.

+1

Das würde zu viele Ressourcen verbrauchen. – evilgoldfish

25

Ich habe als 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; 
} 
+1

Es ist nicht notwendig, alle Zeichen in textEntered zu durchlaufen.Sie können nur überprüfen, Unicar c = [textEntered characterAtIndex: [textEntered length] - 1]; Sie brauchen nicht die for-Schleife –

+0

und Sie müssen auch sicherstellen, dass es ja zurückgibt, wenn Backspace-Zeichen eingegeben wird –

+2

@PatrickAnarna: Überprüfen des letzten Zeichens ist nicht ausreichend. 'textEntered' könnte ein eingefügtes Textstück mit mehr als einem Zeichen sein. –

3

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

1

Dies ist, was ich benutze, um den Benutzer auf Großbuchstaben A-Z zu beschränken. Passen Sie die reguläre Variable je nach Geschmack an:

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

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

Das Semikolon nach "Regex" sollte nicht da sein. – Koen

+0

Editiert für Semikolonfehler. –

0

Wie wäre es damit?

- (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 alle Zeichen mache Fall zu senken [string lowercaseString], so dass Sie in regex nicht für captial/Kleinbuchstaben schreiben müssen.

Verwandte Themen