当前位置: 首页 > 知识库问答 >
问题:

如何为UITextField包含预定义的文本格式,并在用户输入时替换精确的范围

祁烨
2023-03-14

当用户输入数据时,它应该实时只替换'#',并且用户应该知道may占位符是如何剩余的。此外,不应替换或删除这些连字符和括号。

当用户删除文本时,它应该再次替换为各自范围内的预定义格式。

共有1个答案

田兴朝
2023-03-14

我找到的解决方案是使用UITextFieldDelegate。有关文本字段的generic-format的示例项目,请参考给定的git-link https://github.com/imitty8/iostextbox_mandatory_format

它是以一种通用的方式进行的。下面的方法是为text_field创建所需的格式。

-(void)loadFormatForTextView {

    openFormat = @"(";
    closeFormat = @")";
    intermideateFormat = @"-";
    charFormat1 = @"#";
    //charFormat2 = nil;

    //(###)-(#######)
    NSArray *formatList = [[NSArray alloc]initWithObjects: openFormat,charFormat1,charFormat1,charFormat1,closeFormat,intermideateFormat,openFormat,charFormat1,charFormat1,charFormat1,charFormat1,charFormat1,charFormat1,charFormat1,closeFormat, nil ];

    phoneFormatString = [[NSMutableString alloc]init];
    for (NSString *formatString in formatList) {
       [phoneFormatString appendString:formatString];
    }
    inputTest = [phoneFormatString copy];
    [_tbPhoneNo setText:phoneFormatString];
}

实现文本字段委托以将预定义格式实现到UITextField中

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    NSCharacterSet *charSet = [NSCharacterSet characterSetWithCharactersInString:charFormat1];
    NSRange range = [textField.text rangeOfCharacterFromSet:charSet];

    if (range.location != NSNotFound)
    {
        UITextPosition *cusorPosition = [textField positionFromPosition:[textField beginningOfDocument] offset:range.location];
        [textField setSelectedTextRange:[textField textRangeFromPosition:cusorPosition toPosition:cusorPosition]];
    }
}

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

    if (range.location < phoneFormatString.length) {

        NSRange replacementRange = range;
        replacementRange.length = 1;
        NSRange nextStringRange;
        nextStringRange.length = 1;

        if([string isEqualToString:@""]) //Backspace
        {
            NSString *deleteString = [textField.text substringWithRange:replacementRange];
            if ([deleteString isEqualToString:openFormat] || [deleteString isEqualToString:closeFormat] || [deleteString isEqualToString:intermideateFormat]) {
            //
            }
            else
            {
                [textField setText:[textField.text stringByReplacingCharactersInRange:replacementRange withString:charFormat1]];
            }
            nextStringRange.location = range.location;
            NSString *nextString;

            for (nextString = [textField.text substringWithRange:nextStringRange]; ([nextString isEqualToString:intermideateFormat] || [nextString isEqualToString:openFormat] ) && nextStringRange.location != 0 ; )
            {
                nextStringRange.location = nextStringRange.location - 1;
                nextString = [textField.text substringWithRange:nextStringRange];
            }

            if (nextStringRange.location != 0) {

                UITextPosition *cusorPosition = [textField positionFromPosition:[textField beginningOfDocument] offset:nextStringRange.location];
                [textField setSelectedTextRange:[textField textRangeFromPosition:cusorPosition toPosition:cusorPosition]];
            }
        }
        else if ([string isEqualToString:@" "]) //BlankSpace
        {
            //Do nothing//
        }
        else //Other
        {
           [textField setText:[textField.text stringByReplacingCharactersInRange:replacementRange withString:string]];
        nextStringRange.location = range.location + 1;

            NSString *nextString = [textField.text substringWithRange:nextStringRange];
            if ([nextString isEqualToString:openFormat] || [nextString isEqualToString:intermideateFormat] || [nextString isEqualToString:closeFormat]) { //Will redirect to first available blank

                NSCharacterSet *charSet = [NSCharacterSet characterSetWithCharactersInString:charFormat1];
                NSRange range = [textField.text rangeOfCharacterFromSet:charSet];

                if (range.location != NSNotFound)
                {
                    UITextPosition *cusorPosition = [textField positionFromPosition:[textField beginningOfDocument] offset:range.location];
                    [textField setSelectedTextRange:[textField textRangeFromPosition:cusorPosition toPosition:cusorPosition]];
                }
            }
            else
            {
                UITextPosition *cusorPosition = [textField positionFromPosition:[textField beginningOfDocument] offset:nextStringRange.location];
                [textField setSelectedTextRange:[textField textRangeFromPosition:cusorPosition toPosition:cusorPosition]];
            }
        }
    }
    return NO;
}

- (BOOL)textFieldShouldClear:(UITextField *)textField {
    [textField setText:phoneFormatString];

    NSCharacterSet *charSet = [NSCharacterSet characterSetWithCharactersInString:charFormat1];
    NSRange range = [textField.text rangeOfCharacterFromSet:charSet];

    if (range.location != NSNotFound)
    {
        UITextPosition *cusorPosition = [textField positionFromPosition:[textField beginningOfDocument] offset:range.location];
        [textField setSelectedTextRange:[textField textRangeFromPosition:cusorPosition toPosition:cusorPosition]];
    }

    return NO;
}
 类似资料:
  • 在使用cssContainingText时,是否有任何方法可以搜索具有精确文本的元素。我使用下面的代码,但下拉列表中有多个值,如下所示。 下面是我正在使用的代码。

  • 问题内容: 当我仅具有对该INPUT的引用时,需要获得对该INPUT的FORM父级的引用。JavaScript有可能吗?如果愿意,请使用jQuery。 这不起作用: 问题答案: 作为输入的本机DOM元素还具有指向它们所属形式的属性: IE 4.0+,Firefox 1.0+,Opera9.0+支持输入字段的属性,这是jQuery保证的更多浏览器,因此您应该坚持这一点。 如果这是另一种类型的元素(不

  • 我正在编写一个函数,它应该接受一个字符串,并单击包含匹配该字符串的文本的html元素。 但是在某些情况下,元素的文本包含特殊字符 ,我的函数无法找到元素。

  • 我需要根据模板生成几个word文档。在每个文档中,都需要替换某些字符串(所有字符串都包含在一组双大括号中,以便轻松区分)。 我试过: **阅读整个模板,并使用正则表达式替换单词的所有出现。替换 **还可以访问每个Text元素 但上述解决方案都不管用,因为在中国。docx文件所有这些花括号都存储在不同的文本元素中(

  • 我从数据库获取的值为10.00520.00,但当我绑定到输入时,它显示为10和520 实例 值绑定到文本框为10,但我希望绑定10.00