卡号前12位应为安全入口,其余4位为正常

时间:2012-11-06 04:18:53

标签: iphone uitextfield

卡号前12位应为安全入口,其余4位正常,例如我输入卡号 - 4111 1111 1111 1111.在文本字段输入此文本时,前12位数应为安全入口,后4位应为正常进入,即1111.(最后卡号看起来像XXXXXXXXXXXX1111)。

任何人都可以解释我该怎么做。

2 个答案:

答案 0 :(得分:5)

一种选择是实施UITextField委托方法textField:shouldChangeCharactersInRange:replacementString:。在这种方法中,您希望始终返回NO。但首先你要更新文本字段的文本,使前12位显示X.你会跟踪另一个ivar中的实际文本。

编辑:这应该有效:

- (NSString *)maskNumber:(NSString *)num {
    static NSString *twelveX = @"XXXXXXXXXXXX";

    if (num.length < twelveX.length) {
        return [twelveX substringToIndex:num.length];
    } else {
        return [twelveX stringByAppendingString:[num substringFromIndex:twelveX.length]];
    }
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Determine where the cursor should be
    UITextRange *selRange = textField.selectedTextRange;
    NSInteger cursorPos = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selRange.start] + string.length;

    _cardNum = [_cardNum stringByReplacingCharactersInRange:range withString:string];

    textField.text = [self maskNumber:_cardNum];

    // Reset the cursor position
    UITextPosition *startPos = [textField positionFromPosition:textField.beginningOfDocument offset:cursorPos];
    selRange = [textField textRangeFromPosition:startPos toPosition:startPos];
    textField.selectedTextRange = selRange;

    return NO;
}

其中_cardNumNSString类型的ivar。这会跟踪实际的卡号。

答案 1 :(得分:4)

我建议您保留两个字段,第一个是12个字符的有限密码字段,用于保护文本。

使用以下委托方法限制字段的长度:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 12) ? NO : YES;
}

设置字段以强制执行安全文本输入:

twelveDigitTextField.secureTextEntry = YES;

第二个字段,您使用与12个字符字段相同的方法限制为四个字符。您无需使用secureTextEntry属性保护此字段。

如果你想让这个界面“好看”,用相同的委托方法跟踪第一个字段的长度,并将第二个字段设置为下一个响应者 - 换句话说,光标将跳转到四个字符的字段一旦十二个字符的字段填满:

/* called within delegate method for 12-character field, once filled up */
[fourDigitTextField becomeFirstResponder]; 

您可能希望这样做的一个原因是为敏感数据(如12位卡号)提供与密码相同的操作系统级保护,输入密码样式{{1} }。

虽然您可以将文本替换为打字文本,但可能更容易忽略允许将此未受保护字段中的敏感数字复制并粘贴到其他应用程序 - 而使用密码字段时,默认情况下这些限制通常就位