2010-05-04 10 views
54

Creando un conjunto de caracteres NS para restringir un UITextField para ingresar nombres de usuario. Quiero que el usuario también pueda ingresar un guión bajo (así [A-Za-z0-9_]) pero alfanuméricoCharacterSet no lo incluye. ¿Hay alguna forma de especificar un rango como ese en forma abreviada? Veo + (id)characterSetWithRange:(NSRange)aRange, pero realmente no entiendo cómo funcionaría.NSCharacterSet: ¿Cómo agrego "_" a la restricción de texto alfanumérico CharacterSet?

Tengo una subclase UITextField simple a la que le paso el juego de caracteres. La restricción funciona bien y no permite al usuario ingresar nada excepto alfanumérico. Solo necesita agregar el "_" a esas concesiones.

NSCharacterSet *characterSet = [NSCharacterSet alphanumericCharacterSet]; 
[textField setAllowed:characterSet]; 
[textField setFrame:frame]; 

Respuesta

115

Objective-C

NSMutableCharacterSet *_alnum = [NSMutableCharacterSet characterSetWithCharactersInString:@"_"]; 
[_alnum formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]]; 

Swift

let _alnum = NSMutableCharacterSet(charactersIn: "_") 
_alnum.formUnion(with: .alphanumerics) 
+4

+1 lo que más me gusta es que alrededor del cacao es que descubro algo nuevo cada día. Esto es nuevo para mí, pero es exactamente la forma correcta de hacerlo. gran descubrimiento! –

+2

De hecho. Elegante y efectivo. Gracias, dibujado hacia adelante. – typeoneerror

28

Otra forma habría sido para que sea mutable y añadirlo.

NSMutableCharacterSet *characterSet = [NSMutableCharacterSet alphanumericCharacterSet]; 
[characterSet addCharactersInString:@"_"]; 
0
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSCharacterSet *blockedCharacters = [[NSCharacterSet whitespaceCharacterSet] invertedSet]; 
    NSCharacterSet *blockedCharacters2 = [[NSCharacterSet letterCharacterSet] invertedSet]; 
    return ([string rangeOfCharacterFromSet:blockedCharacters].location == NSNotFound || [string rangeOfCharacterFromSet:blockedCharacters2].location); 

} 
Cuestiones relacionadas