2009-06-18 7 views
11

私のアプリケーションにはUITextFieldがあります。フィールドに入力できる文字のセットを、私が定義したセットに制限したいと思います。UITextFieldに入力された文字をフィルタリングする

- (BOOL)textFieldShouldReturn:(UITextField*)textField 

をただし、これはユーザーに制限された文字が最終値から削除されているもののとして誤った印象を与え、彼らは目に見えてまだあった:私は、テキストがUITextFieldDelegateメソッドを使用してコミットされたときに文字がフィールドに入力されたフィルタリングができReturn/Done /などを押す前にテキストフィールドに入力します。制限された文字がキーボード上で選択されているときにテキストフィールドに表示されないようにする最良の方法は何ですか?

注:私は、iPhoneキーボードでどのキーが提供されているかをほとんど制御できないという前提で動作しています。私はさまざまなキーボードの実装を切り替えることができますが、特定のキーを無効にできないという印象を受けています。この前提は正しくない可能性があります。 textField:shouldChangeCharactersInRange

この方法で

答えて

13

ルックは、新たな文字が入力されたり、既存の文字はテキストフィールドから削除されるたびにUITextFieldDelegateによって呼び出されます。あなたは変更を許可しないためにNOを返すことができます。

+2

この回答のサンプルコードは、ここで見つけることができます:http://stackoverflow.com/questions/1013647/filtering-characters-entered-into-a-uitextfield/1015262#1015262 – teabot

+2

このすぐ下の+1 – uerceg

2

UITextViewDelegateの方法- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)stringをご覧ください。

これはまさに必要なものです。

-6

DidBeginEditingメソッドが呼び出された後にUITextField.textプロパティが変更された場合は、ループしてチェックを続けることができます。それがある場合は、テキストをチェックし、不正な文字を削除してください。

+1

これはあまりにも多くのリソースを使い果たしてしまいます。 – evilgoldfish

25

私はmarccが提案したようにうまくいきました。サンプルの実装は次のとおりです。

注:変数名は、簡潔にするために選択し、自分のコーディング標準を反映していない。ここで

... 
    myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"xyzXYZ"]; 
    ... 
} 

- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered { 
    for (int i = 0; i < [textEntered length]; i++) { 
     unichar c = [textEntered characterAtIndex:i]; 
     if (![myCharSet characterIsMember:c]) { 
      return NO; 
     } 
    } 
    return YES; 
} 
+1

textEntered内のすべての文字を反復処理する必要はありません。unichar c = [textEntered characterAtIndex:[textEntered length] - 1]をチェックすることができます。あなたはforループ –

+0

を必要とせず、バックスペース文字が入力されたときにyesを返すようにする必要があります。 –

+2

@PatrickAnarna:最後の文字をチェックするだけでは不十分です。 'textEntered'は、複数の文字を含むテキストの貼り付けられた塊です。 –

3

はUITextFieldの中に入力した文字を制限する最もクリーンなアプローチの一つです。このアプローチでは、複数の定義済みNSCharacterSetsを使用できます。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 

    NSMutableCharacterSet *allowedCharacters = [NSMutableCharacterSet alphanumericCharacterSet]; 
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; 
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]]; 

    if([string rangeOfCharacterFromSet:allowedCharacters.invertedSet].location == NSNotFound){ 

     return YES; 

    } 

    return NO; 

} 
1

これは、ユーザーを大文字のA〜Zに制限するために使用します。味に応じて正規表現の変数を調整してください:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString* regex = @"[^A-Z]"; 
    return ([string rangeOfString: regex 
         options:NSRegularExpressionSearch].location == NSNotFound); 
}; 
+1

「正規表現」の後のセミコロンはそこにあってはなりません。 – Koen

+0

セミコロンエラーのために編集されました。 –

0

どうやってですか?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString* regex = @"[^a-z]"; 
    return ([[string lowercaseString] rangeOfString: regex 
         options:NSRegularExpressionSearch].location == NSNotFound); 
}; 

注:

私はあなたがキャピタル・/小文字のための正規表現で記述する必要がないようにケース[string lowercaseString]を下げるために、すべての文字を作っています。

関連する問題