2012-09-04 9 views
12

Tengo dos campos de texto que me gustaría limitar el número y el tipo de caracteres. He utilizado los siguientes bits de código para hacer cada función por separado, pero no puedo encontrar una manera de hacer ambas cosas dentro de la misma función.UITextField limita el número y tipo de caracteres

Para restringir el tipo de personaje:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    // Only characters in the NSCharacterSet you choose will insertable. 
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefgABCDEFG"] invertedSet]; 
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""]; 
    return [string isEqualToString:filtered]; 
} 

y limitar el número de caracteres:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
if (textField.text.length >= 10 && range.length == 0) 
return NO; 
return YES; 
} 

Respuesta

20
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if (textField.text.length >= 10 && range.length == 0) 
     return NO; 
    // Only characters in the NSCharacterSet you choose will insertable. 
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefgABCDEFG"] invertedSet]; 
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""]; 
    return [string isEqualToString:filtered]; 
} 

Editado

Si desea agregar condiciones diferentes para el tercer campo de texto, puede hacerlo así.
crear la referencia para la tercera texto Fild dicen thirdField

continuación, utilizar este

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if (textField == thirdField) { 
     //your contion e.g 
     if (textField.text.length < 7) { 
      return YES; 
     } else { 
      return NO; 
     }   
    } 
    else { 
     if (textField.text.length >= 10 && range.length == 0) 
      return NO; 
     // Only characters in the NSCharacterSet you choose will insertable. 
     NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefgABCDEFG"] invertedSet]; 
     NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""]; 
     return [string isEqualToString:filtered]; 
    } 
} 
+0

Si agregué un tercer campo de texto pero quería aplicarle condiciones diferentes, ¿cómo lo haría? – Tool

+0

He editado mi respuesta. –

2

Ésta es la forma:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    { 
     // Only characters in the NSCharacterSet you choose will insertable. 
     NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefgABCDEFG"] invertedSet]; 
     NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""]; 
     bool cond1 = [string isEqualToString:filtered]; 

    if (textField.text.length >= 10 && range.length == 0){ 
      return NO; 
    }else{ 
      return (cond1); 
    } 

    } 
+0

Lo escribí rápidamente, pero la idea es verificar que ambas condiciones estén correctas – Resh32

+0

'if (cond1) return YES; else return NO' - ¿por qué no simplemente 'return (cond1)'? Siempre me desconcertará. – Cyrille

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]]; 
    [allowedCharacters addCharactersInString:@":./"]; //allow arbitrary characters 

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

     return YES; 

    } 

    return NO; 

} 
Cuestiones relacionadas