カード番号の最初の 12 桁はセキュア エントリであり、残りの 4 桁は通常どおりカード番号を入力する必要があります。たとえば、カード番号 - 4111 1111 1111 1111 を入力しています。つまり、1111.(最終的にカード番号は XXXXXXXXXXXX1111 のようになります)。
誰でもその方法を説明できますか。
カード番号の最初の 12 桁はセキュア エントリであり、残りの 4 桁は通常どおりカード番号を入力する必要があります。たとえば、カード番号 - 4111 1111 1111 1111 を入力しています。つまり、1111.(最終的にカード番号は XXXXXXXXXXXX1111 のようになります)。
誰でもその方法を説明できますか。
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
。これにより、実際のカード番号が追跡されます。
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
。
タイプライターでテキストを置き換えることでトリックを行うことはできますが、この保護されていないフィールドから機密性の高い番号をコピーして別のアプリケーションに貼り付けることを許可するのは見落としがちです。一方、パスワード フィールドの場合、これらの制限は通常デフォルトで設定されています。