web-dev-qa-db-ja.com

NSCharacterSet:alphanumericCharacterSetテキスト制限に「_」を追加するにはどうすればよいですか?

ユーザー名を入力するためのUITextFieldを制限するNSCharacterセットを構築します。ユーザーにアンダースコアも入力できるようにしたいので([A-Za-z0-9_]のように)、alphanumericCharacterSetにはアンダースコアが含まれていません。そのような範囲を短い形式で指定する方法はありますか?私は+ (id)characterSetWithRange:(NSRange)aRangeを参照していますが、それがどのように機能するのか本当に理解していません。

文字セットを渡す単純なUITextFieldサブクラスがあります。制限は適切に機能し、ユーザーが英数字以外を入力することはできません。これらのアローワンスに「_」を追加するだけです。

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

Objective-C

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

スウィフト

let _alnum = NSMutableCharacterSet(charactersIn: "_")
_alnum.formUnion(with: .alphanumerics)
119
drawnonward

別の方法は、変更可能にして追加することでした。

Objective-C

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

スウィフト

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
28
Russ Van Bert
- (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);  

}
0
AsbelK