【问题标题】:UITextField input mask?UITextField 输入掩码?
【发布时间】:2015-02-06 13:59:57
【问题描述】:

http://sublime.nyasha.me/admin/form_masks.html

我使用这种技术在 html/css/java 等方面取得了不错的效果,但是如何在 Objective-c 中实现呢?

到目前为止,我已经阅读了有关数字格式的内容,但是我如何才能真正拥有它,以便当内容可编辑时,它会在他们键入时显示格式化版本,并且不允许它们在某些区域超过 .length .

我需要用它的例子是

00:00:0000h:00m:00s 所以当编辑它会达到__:__:____h:__m:__s 我一直在互联网上搜索,找不到这样的技术,到目前为止我已经考虑过以编程方式做这样的事情。 .

3x UITextField 1x UILabel

if (editing is commenced && value changed) {
    if (.length == 2) {
        Move onto next UITextField;
    }
} 

并在文本字段上显示 UILabel 蒙版,还可以自定义文本字段,使 3 看起来是一个。

-- 编辑

//Programming the Textfield Mask
-(void)reformatAsCardNumber:(UITextField *)textField
{
    NSUInteger targetCursorPosition =
    [textField offsetFromPosition:textField.beginningOfDocument
                       toPosition:textField.selectedTextRange.start];

    NSString *cardNumberWithoutSpaces =
    [self removeNonDigits:textField.text
andPreserveCursorPosition:&targetCursorPosition];

    if ([cardNumberWithoutSpaces length] > 6) {
        [textField setText:previousTextFieldContent];
        textField.selectedTextRange = previousSelection;
        return;
    }

    NSString *cardNumberWithSpaces =
    [self insertSpacesEveryFourDigitsIntoString:cardNumberWithoutSpaces
                      andPreserveCursorPosition:&targetCursorPosition];

    textField.text = cardNumberWithSpaces;
    UITextPosition *targetPosition =
    [textField positionFromPosition:[textField beginningOfDocument]
                             offset:targetCursorPosition];

    [textField setSelectedTextRange:
     [textField textRangeFromPosition:targetPosition
                           toPosition:targetPosition]
     ];
}

-(BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
    previousTextFieldContent = textField.text;
    previousSelection = textField.selectedTextRange;

    return YES;
}

- (NSString *)removeNonDigits:(NSString *)string
    andPreserveCursorPosition:(NSUInteger *)cursorPosition
{
    NSUInteger originalCursorPosition = *cursorPosition;
    NSMutableString *digitsOnlyString = [NSMutableString new];
    for (NSUInteger i=0; i<[string length]; i++) {
        unichar characterToAdd = [string characterAtIndex:i];
        if (isdigit(characterToAdd)) {
            NSString *stringToAdd =
            [NSString stringWithCharacters:&characterToAdd
                                    length:1];

            [digitsOnlyString appendString:stringToAdd];
        }
        else {
            if (i < originalCursorPosition) {
                (*cursorPosition)--;
            }
        }
    }

    return digitsOnlyString;
}
- (NSString *)insertSpacesEveryFourDigitsIntoString:(NSString *)string
                          andPreserveCursorPosition:(NSUInteger *)cursorPosition
{
    NSMutableString *stringWithAddedSpaces = [NSMutableString new];
    NSUInteger cursorPositionInSpacelessString = *cursorPosition;
    for (NSUInteger i=0; i<[string length]; i++) {
        if ((i>0) && ((i % 2) == 0)) {
            [stringWithAddedSpaces appendString:@":"];
            if (i < cursorPositionInSpacelessString) {
                (*cursorPosition)++;
            }
        }
        unichar characterToAdd = [string characterAtIndex:i];
        NSString *stringToAdd =
        [NSString stringWithCharacters:&characterToAdd length:1];

        [stringWithAddedSpaces appendString:stringToAdd];
    }

    return stringWithAddedSpaces;
}

然后调用它

[_answerTextField addTarget:self
                  action:@selector(reformatAsCardNumber:)
        forControlEvents:UIControlEventEditingChanged];

我需要预先确定的文本,例如 __:__:__ 或最好是 __h:__m:__s,因此当您开始输入时,您会在填写时得到 00h:0_m:__

现在,我得到 `` 然后当我开始输入时,我得到 00:0 等。

【问题讨论】:

    标签: objective-c uitextfield


    【解决方案1】:

    在屏幕上更新之前,使用 textFieldShouldChange 方法修改输入/根据需要移动光标

    它在UITextFieldDelegate:

    textField:shouldChangeCharactersInRange:replacementString:
    询问委托人是否应更改指定的文本。
    每当用户在文本字段中键入新字符或删除现有字符时,文本字段都会调用此方法。


    此外,委托中还有 textDidChange ,它在显示文本后起作用


    这些是 DELEGATE 方法,因此您必须成为 textField 的委托:

    //1 conform to the delegate
    @interface MyViewController <UITextFieldDelegate>
    

    然后

    //2 set yourself as delegate (can also be done through IB)
    textView.delegate = self;
    

    【讨论】:

    • shouldChange :: 编辑时 - 在显示之前每次按下一个键都会调用它
    • 啊不,它们是委托方法,因此您必须使自己符合 UITextFieldDelegate 协议并且必须成为文本字段的委托。写的不好
    • 非常感谢您的帮助。
    • 没关系。我刚刚使用了一个占位符来给出基本说明,而不是过多地胡扯。
    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多