Création d'un ensemble NSCharacter pour restreindre un UITextField pour la saisie de noms d'utilisateurs. Je veux que l'utilisateur puisse également entrer un trait de soulignement (donc [A-Za-z0-9_]) mais alphanumericCharacterSet ne l'inclut pas. Existe-t-il un moyen de spécifier une plage comme celle-ci sous forme abrégée? Je vois + (id)characterSetWithRange:(NSRange)aRange
, mais je ne comprends pas vraiment comment cela fonctionnerait.
J'ai une simple sous-classe UITextField à laquelle je passe le jeu de caractères. La restriction fonctionne correctement et ne permet pas à l'utilisateur de saisir autre chose qu'un alphanumérique. Il suffit d'ajouter le "_" à ces allocations.
NSCharacterSet *characterSet = [NSCharacterSet alphanumericCharacterSet];
[textField setAllowed:characterSet];
[textField setFrame:frame];
Objectif-C
NSMutableCharacterSet *_alnum = [NSMutableCharacterSet characterSetWithCharactersInString:@"_"];
[_alnum formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
rapide
let _alnum = NSMutableCharacterSet(charactersIn: "_")
_alnum.formUnion(with: .alphanumerics)
Une autre façon aurait été de le rendre mutable et de l'ajouter.
Objectif-C
NSMutableCharacterSet *characterSet = [NSMutableCharacterSet alphanumericCharacterSet];
[characterSet addCharactersInString:@"_"];
rapide
let characterSet = NSMutableCharacterSet.alphanumeric()
characterSet.addCharacters(in: "_")
Vous pouvez vérifier qu'il a été ajouté (dans une aire de jeux) avec:
characterSet.characterIsMember(UInt16(Character("^").unicodeScalars.first!.value)) // false
characterSet.characterIsMember(UInt16(Character("_").unicodeScalars.first!.value)) // true -- YAY!
characterSet.characterIsMember(UInt16(Character("`").unicodeScalars.first!.value)) // false
- (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);
}