2016-09-27 67 views
0

有什么方法可以将复制的文本/字符串过滤到UITextField? 我已经尝试使用UITextField方法shouldChangeCharactersInRange,但它只在我们输入时进行过滤,但是当我们粘贴到它时,仍然无法过滤。我希望UITextField只能通过字母数字输入,但它仍然可以通过复制粘贴通过其他字符输入。如何过滤复制粘贴字符串目标c

这里有一块我的代码

- (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,因此根本不会更新该字段。要求是_filter_非字母数字,即返回YES,但只更新为“dghj”。 – norders