3

カード番号の最初の 12 桁はセキュア エントリであり、残りの 4 桁は通常どおりカード番号を入力する必要があります。たとえば、カード番号 - 4111 1111 1111 1111 を入力しています。つまり、1111.(最終的にカード番号は XXXXXXXXXXXX1111 のようになります)。

誰でもその方法を説明できますか。

4

2 に答える 2

5

1 つのオプションは、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

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;

2 番目のフィールドは、12 文字のフィールドに使用されるのと同じアプローチで 4 文字に制限します。secureTextEntryこのフィールドをプロパティで保護する必要はありません。

このインターフェイスを「適切」にしたい場合は、同じデリゲート メソッドを使用して最初のフィールドの長さを追跡し、2 番目のフィールドを次のレスポンダーとして設定します。 -文字フィールドがいっぱい:

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

このようにしたい理由の 1 つは、機密データ (12 桁のカード番号など) に対して、password-style に入力されたパスワードと同じ OS レベルの保護を取得するためですUITextField

タイプライターでテキストを置き換えることでトリックを行うことはできますが、この保護されていないフィールドから機密性の高い番号をコピーして別のアプリケーションに貼り付けることを許可するのは見落としがちです。一方、パスワード フィールドの場合、これらの制限は通常デフォルトで設定されています。

于 2012-11-06T05:35:11.353 に答える