2016-09-27 12 views
0

コピーされたテキスト/文字列をUITextFieldにフィルタリングする方法はありますか? すでにUITextFieldメソッドshouldChangeCharactersInRangeを使用しようとしましたが、入力するときにフィルタリングするだけですが、貼り付けてもフィルタリングできません。 UITextFieldは英数字でしか入力できませんが、コピー貼り付けで他の文字で入力することもできます。ここコピー貼り付け文字列の目的をフィルタリングする方法

は、私のコードの一部は、事前に

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
if (textField == _nameField) { 
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NAME_CHARACTERS] invertedSet]; 
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; 
return [string isEqualToString:filtered]; 
} 

おかげです。

答えて

0

shouldChangeCharactersInRangeは、ユーザーがフィールドにペーストしても呼び出されます。

あなたはその関数の内部で必要なものを行うのに苦労している場合は、簡単なハックはこれを行うことです。

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

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [self textFieldDidUpdate:textField]; 
    }); 

    return YES; 
} 

- (void)textFieldDidUpdate:(UITextField *)textField { 
    // Filter and reset your textfield content 
} 

それは理想的ではないのですが、それは仕事を取得します。

+0

'関数を呼び出すには引数が少なすぎます' – Pareho

+0

括弧が多すぎます。私は 'dispatch_after'スニペットを編集しました。 – norders

0

多分、これはあなたを助けるでしょう。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet]; 
    BOOL valid = [[string stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""]; 
    return valid; 
} 

あなたはこの

NSCharacterSet *unwantedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; 
NSLog(@"%@",[[string componentsSeparatedByCharactersInSet: unwantedCharacters] componentsJoinedByString: @""]); 

は、しかし、あなたがフィールドにいくつかの操作を自分で行う必要があります使用することができますのみ、英数字の文字列を取得します。

+0

'stringByTrimmingCharactersInSet'は、文字列の両端から文字をトリムします。 – norders

+0

両端の文字が英数字のときはいつでも切り詰められます。すべてが英数字の場合、結果の文字列は@ ""です。例えば、 "asdf-ret-tr"をトリミングした場合、 "--ret-"が返されますが、 ""ではありません。 –

+0

確かに、文字列が "%d&ghj *"であればNOを返すので、フィールドをまったく更新しません。この要件は、英数字以外の文字を除外すること、すなわち「YES」を返すことであり、「dghj」だけを更新することである。 – norders

関連する問題