【问题标题】:How to filter copy paste string objective c如何过滤复制粘贴字符串目标c
【发布时间】:2017-02-04 22:08:48
【问题描述】:

有没有办法将复制的文本/字符串过滤成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];
}

提前致谢。

【问题讨论】:

    标签: ios objective-c iphone xcode uitextfield


    【解决方案1】:

    也许这会对你有所帮助。

    - (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: @""]);
    

    但是,您必须自己在现场进行一些操作。

    【讨论】:

    • stringByTrimmingCharactersInSet 只修剪字符串两端的字符。
    • 只要两端的字符是字母数字,它就会修剪。如果它们都是字母数字,则生成的字符串为@""。例如,如果它修剪“asdf-ret-tr”,这将返回“-ret-”,而不是“”。
    • 当然,但是如果字符串是“%d&ghj*”,则返回 NO,因此根本不更新该字段。要求是过滤非字母数字,即返回YES,但只用“dghj”更新。
    【解决方案2】:

    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
    }
    

    这并不理想,但可以完成工作。

    【讨论】:

    • 我收到错误“函数调用的参数太少”
    • 抱歉,括号太多了。我已经编辑了dispatch_after sn-p。
    猜你喜欢
    • 2015-07-17
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多