ユーザー名を入力するためのUITextFieldを制限するNSCharacterセットを構築します。ユーザーにアンダースコアも入力できるようにしたいので([A-Za-z0-9_]のように)、alphanumericCharacterSetにはアンダースコアが含まれていません。そのような範囲を短い形式で指定する方法はありますか?私は+ (id)characterSetWithRange:(NSRange)aRange
を参照していますが、それがどのように機能するのか本当に理解していません。
文字セットを渡す単純なUITextFieldサブクラスがあります。制限は適切に機能し、ユーザーが英数字以外を入力することはできません。これらのアローワンスに「_」を追加するだけです。
NSCharacterSet *characterSet = [NSCharacterSet alphanumericCharacterSet];
[textField setAllowed:characterSet];
[textField setFrame:frame];
Objective-C
NSMutableCharacterSet *_alnum = [NSMutableCharacterSet characterSetWithCharactersInString:@"_"];
[_alnum formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
スウィフト
let _alnum = NSMutableCharacterSet(charactersIn: "_")
_alnum.formUnion(with: .alphanumerics)
別の方法は、変更可能にして追加することでした。
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
- (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);
}