卡号前12位数字应该是安全的进入和其余4位为正常(Card number first 12 digi

2019-07-03 14:51发布

卡号前12位数字应该是安全的进入和其余4位为正常的例子中,我输入卡号 - 4111 1111 1111 1111虽然进入文本字段前12位数字这段文字应该是安全的进入和最后4位数字应为正常进入即,1111(最后卡号会看起来像XXXXXXXXXXXX1111)。

任何一个可以解释我如何做到这一点。

Answer 1:

一种选择是实现UITextField委托方法textField:shouldChangeCharactersInRange:replacementString: 在这种方法中,你会想总是返回NO。 但首先,你会更新文本字段的文本,使得前12位数字显示的X.你会跟踪在另一个实例变量的实际文本。

编辑:这应该工作:

- (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;
}

其中_cardNum是类型的实例变量NSString 。 这种跟踪实际卡号。



Answer 2:

我建议你保持两个领域,第一,用于固定文本中的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位卡号)作为密码相同的操作系统级别的保护,进入密码式UITextField

虽然你可以用替换文本的打字技巧,它可能是容易被人忽视从这个未受保护的领域让敏感的数字被复制并粘贴到另一个应用程序 - 而用密码字段,这些限制通常是在默认地方。



文章来源: Card number first 12 digits should be secure entry and remaining 4 digits as normal