2009-06-18 14 views
11

Tengo un UITextField en mi aplicación. Me gustaría restringir el conjunto de caracteres que pueden ser ingresados ​​en el campo a un conjunto que he definido. Pude filtrar los caracteres introducidos en el campo cuando el texto está comprometido con el método UITextFieldDelegate:Filtrar caracteres ingresados ​​en un UITextField

- (BOOL)textFieldShouldReturn:(UITextField*)textField 

Sin embargo, esto le da al usuario una impresión falsa ya que aunque caracteres restringidos se eliminan del valor final, todavía eran visiblemente ingresado en el campo de texto antes de presionar Retorno/Hecho/etc. ¿Cuál es el mejor enfoque que evitaría que aparezcan caracteres restringidos en el campo de texto a medida que se seleccionan en el teclado?

Nota: Estoy operando bajo la suposición de que tengo poco control sobre qué claves son proporcionadas por el teclado (s) del iPhone. Soy consciente de que puedo cambiar entre varias implementaciones de teclado, pero tengo la impresión de que no puedo deshabilitar teclas específicas. Esta suposición puede ser incorrecta.

Respuesta

13

Mira textField:shouldChangeCharactersInRange

Este método es llamado por el UITextFieldDelegate cada vez que nuevos caracteres se escriben o caracteres existentes se eliminan del campo de texto. Podría devolver NO para no permitir el cambio.

+2

El código de ejemplo para esta respuesta se puede encontrar aquí: http://stackoverflow.com/questions/1013647/filtering-characters-entered-into-a-uitextfield/1015262#1015262 – teabot

+2

Buen trabajo añadiendo URL a su respuesta que es justo debajo de este. +1 – uerceg

2

Mire el método UITextViewDelegate- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string.

Es exactamente lo que necesita.

-6

Puede seguir y seguir comprobando si la propiedad UITextField.text ha cambiado una vez que se llama al método DidBeginEditing. Si lo tiene, verifique el texto y elimine los caracteres incorrectos.

+1

Eso consumiría demasiados recursos. – evilgoldfish

25

Hice lo que marcc sugirió y funcionó bien. La implementación de la muestra sigue.

Nota: Se seleccionaron Los nombres de variables a la brevedad y no reflejan mis estándares de codificación:

... 
    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

no es necesario recorrer todos los caracteres en textEntered.simplemente puede verificar unichar c = [textEntered characterAtIndex: [textEntered length] - 1]; no necesita el bucle for –

+0

y también necesita asegurarse de que devuelve yes cuando se ingresa el carácter de retroceso –

+2

@PatrickAnarna: verificar el último carácter no es suficiente. 'textEntered' podría ser un fragmento de texto pegado con más de un caracter. –

3

Aquí es uno de los enfoques más limpios a la restricción de caracteres introducidos en un UITextField. Este enfoque permite el uso de múltiples NSCharacterSets predefinidos.

-(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; 

} 
1

Esto es lo que uso para restringir al usuario a mayúsculas A-Z. Ajuste la variable regex según el gusto:

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

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

El punto y coma después de "regex" no debería estar allí. – Koen

+0

Editado por error de punto y coma. –

0

¿Qué le parece esto?

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

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

Nota:

estoy haciendo todos los caracteres a minúsculas [string lowercaseString] de manera que no es necesario escribir en expresiones regulares para captial/minúsculas.

Cuestiones relacionadas