27 votes

UITextField secureTextEntry - fonctionne en passant de OUI à NON, mais revenir à OUI n'a aucun effet

J'ai un champ UITextField sécurisé, mais je veux donner aux utilisateurs la possibilité de le rendre non sécurisé (afin qu'ils puissent voir avec certitude ce qu'ils ont tapé s'ils se trouvent dans une zone privée). Cependant, supposons qu'ils appuient sur le bouton de basculement par erreur et qu'ils veuillent le remettre en mode sécurisé. Cela ne fonctionne pas. J'ai tout essayé - utiliser -1 au lieu de YES, effacer le texte puis le remettre. Je n'ai pas d'autres idées. [Entré rdar://9781908]

EDIT : Je crois que ce problème est résolu depuis iOS5.

46voto

MikeR Points 294

Il doit s'agir d'un problème de mise au point de l'entrée : lorsque l'entrée est mise au point, le champ UITextField ne peut changer que de ON->OFF.
Essayez l'astuce suivante pour passer de OFF à ON :

textField.enabled = NO;
textField.secureTextEntry = YES;
textField.enabled = YES;
[textField becomeFirstResponder];

EDIT (dhoerl) : Dans iOS 9.3, j'ai trouvé que cela fonctionne mais il y a un problème. Si vous entrez disons 3 chara

    if textview should go into secure mode and the textfield is not empty {
        textField.text = ""
        textField.secureTextEntry = true

        UIPasteboard.generalPasteboard().string = password
        textField.paste(self)
        UIPasteboard.generalPasteboard().string = ""
    }

I

23voto

Sandy Points 1115

M

BOOL wasFirstResponder;
if ((wasFirstResponder = [passwordField isFirstResponder])) {
    [passwordField resignFirstResponder];
}
// In this example, there is a "show password" toggle
[passwordField setSecureTextEntry:![passwordField isSecureTextEntry]];
if (wasFirstResponder) {
    [passwordField becomeFirstResponder];
}

T

1voto

David H Points 23654

J'ai saisi rdar contre ce problème, mais j'ai trouvé une solution. Il s'agit essentiellement de remplacer par programme le contrôle "bloqué" par un nouveau. La chose la plus simple à faire est d'archiver le contrôle existant dans viewDidLoad puis de le désarchiver si nécessaire :

// do in viewDidLoad
self.passwordMemberArchive = [NSMutableData data];
NSKeyedArchiver *ka = [[NSKeyedArchiver alloc]       initForWritingWithMutableData:passwordMemberArchive];
[ka encodeObject:password];
[ka finishEncoding];
[ka release];

    // In the action method when you get the UISwitch action message ---
// when your switch changes state
if(isOn) {
    NSString *text = [NSString stringWithString:password.text];
    NSKeyedUnarchiver *kua = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    UITextField *tf = [kua decodeObject];
    [kua finishDecoding];
    [kua release];
    tf.inputAccessoryView = textField.inputAccessoryView;
    tf.frame = textField.frame;

    BOOL isFirstResponder = [textField isFirstResponder];
    [scrollView insertSubview:tf aboveSubview:textField];
    if(isFirstResponder) {
        [tf becomeFirstResponder];
    }

    [textField removeFromSuperview];
    self.password = tf;

    if([text length]) {
        if(isFirstResponder) {
            // http://stackoverflow.com/questions/1317929/insert-string-at-cursor-position-of-uitextfield
            // Get a reference to the system pasteboard
            UIPasteboard* lPasteBoard = [UIPasteboard generalPasteboard];
            // Save the current pasteboard contents so we can restore them later
            NSArray* lPasteBoardItems = [lPasteBoard.items copy];
            // Update the system pasteboard with my string
            lPasteBoard.string = text;
            // Paste the pasteboard contents at current cursor location
            [tf paste:self];
            // Restore original pasteboard contents
            lPasteBoard.items = lPasteBoardItems;
            [lPasteBoardItems release];
        } else {
            tf.text = text;
        }
    }
} else {
    textField.secureTextEntry = NO;
}

0voto

David Rees Points 2190

S

if #available(iOS 9.2, *) {
    passwordTextField.secureTextEntry = !passwordTextField.secureTextEntry
}
else {
    let wasFirstResponder = passwordTextField.isFirstResponder()
    if wasFirstResponder {
        passwordTextField.resignFirstResponder()
    }

    passwordTextField.secureTextEntry = !passwordTextField.secureTextEntry
    if wasFirstResponder {
        passwordTextField.becomeFirstResponder()
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X