web-dev-qa-db-fra.com

Comment ajouter du textField dans UIAlertController?

enter image description here

enter image description here

Je veux réaliser une fonction sur le changement de mot de passe, il demande à l'utilisateur de saisir son mot de passe précédent et je le conçois dans une boîte de dialogue d'alerte. Je souhaite cliquer sur le bouton "Confirmer la modification", puis passer à l'autre contrôleur de vue pour changer le mot de passe. J'ai écrit du code, mais je ne sais pas écrire dans l'instant qui suit.

42
Juice007

Vous pouvez ajouter plusieurs champs de texte pour alerter le contrôleur et y accéder avec la propriété textFields du contrôleur d'alerte.

Si le nouveau mot de passe est une chaîne vide, présentez à nouveau l'alerte. Sinon, vous pouvez également désactiver le bouton "Confirmer", en l’activant uniquement lorsque le champ de texte contient du texte.

UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"confirm the modification" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
    UITextField *password = alertController.textFields.firstObject;
    if (![password.text isEqualToString:@""]) {

        //change password

    }
    else{
        [self presentViewController:alertController animated:YES completion:nil];
    }
}];
36
Charmi Gheewala

Vous obtiendrez tous les champs de texte ajoutés à partir du contrôleur d'alerte par sa propriété textFields en lecture seule, vous pouvez l'utiliser pour obtenir son texte. Comme

Swift 4:

let alertController = UIAlertController(title: "", message: "", preferredStyle: .alert)
alertController.addTextField { textField in
    textField.placeholder = "Password"
    textField.isSecureTextEntry = true
}
let confirmAction = UIAlertAction(title: "OK", style: .default) { [weak alertController] _ in
    guard let alertController = alertController, let textField = alertController.textFields?.first else { return }
    print("Current password \(String(describing: textField.text))")
    //compare the current password and do action here
}
alertController.addAction(confirmAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)

Remarque: textField.text est facultatif, décompressez-le avant d'utiliser

Objective-C:

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:UIAlertControllerStyleAlert];
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    textField.placeholder = @"Current password";
    textField.secureTextEntry = YES;
}];
UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    NSLog(@"Current password %@", [[alertController textFields][0] text]);
    //compare the current password and do action here

}];
[alertController addAction:confirmAction];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
    NSLog(@"Canelled");
}];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];

Par [[alertController textFields][0] text] cette ligne, le premier champ de texte ajouté à alerController sera récupéré et le texte obtenu.

77
Johnykutty

Voici une réponse mise à jour pour Swift 4.0 qui crée le type de champ de texte souhaité:

// Create a standard UIAlertController
let alertController = UIAlertController(title: "Password Entry", message: "", preferredStyle: .alert)

// Add a textField to your controller, with a placeholder value & secure entry enabled
alertController.addTextField { textField in
    textField.placeholder = "Enter password"
    textField.isSecureTextEntry = true
    textField.textAlignment = .center
}

// A cancel action
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { _ in
    print("Canelled")
}

// This action handles your confirmation action
let confirmAction = UIAlertAction(title: "OK", style: .default) { _ in
    print("Current password value: \(alertController.textFields?.first?.text ?? "None")")
}

// Add the actions, the order here does not matter
alertController.addAction(cancelAction)
alertController.addAction(confirmAction)

// Present to user
present(alertController, animated: true, completion: nil)

Et à quoi ça ressemble quand on les présente pour la première fois: enter image description here

Et en acceptant le texte:

enter image description here

11
CodeBender