3

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

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

4

2 回答 2

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

_cardNum类型的 ivar在哪里NSString。这会跟踪实际的卡号。

于 2012-11-06T05:25:59.517 回答
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 位卡号)获得与密码相同的操作系统级保护,输入密码样式UITextField

虽然您可以将文本替换为打字的技巧,但可能更容易忽略允许将此未受保护字段中的敏感数字复制并粘贴到另一个应用程序 - 而对于密码字段,这些限制通常在默认情况下存在。

于 2012-11-06T05:35:11.353 回答