NSCharacterSet: Как добавить «_» к текстовому ограничению alphanumericCharacterSet? - PullRequest
55 голосов
/ 04 мая 2010

Создание набора NSCharacter для ограничения UITextField для ввода имен пользователей. Я хочу, чтобы пользователь также мог вводить подчеркивание (поэтому [A-Za-z0-9_]), но alphanumericCharacterSet не включает его. Есть ли способ указать такой диапазон в краткой форме? Я вижу + (id)characterSetWithRange:(NSRange)aRange, но я не совсем понимаю, как это будет работать.

У меня есть простой подкласс UITextField, которому я передаю набор символов. Ограничение работает нормально и не позволяет пользователю вводить что-либо, кроме буквенно-цифровых символов. Просто нужно добавить "_" к этим пособиям.

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

Ответы [ 3 ]

119 голосов
/ 04 мая 2010

Objective-C

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

Swift

let _alnum = NSMutableCharacterSet(charactersIn: "_")
_alnum.formUnion(with: .alphanumerics)
28 голосов
/ 15 марта 2012

Другим способом было бы сделать его изменяемым и добавить его.

Objective-C

NSMutableCharacterSet *characterSet = [NSMutableCharacterSet alphanumericCharacterSet];
[characterSet addCharactersInString:@"_"];

Swift

let characterSet = NSMutableCharacterSet.alphanumeric()
characterSet.addCharacters(in: "_")

Вы можете проверить, что он был добавлен (на игровой площадке) с помощью:

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
0 голосов
/ 14 января 2015
- (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);  

}
...