La fenêtre UIAlertViewController se ferme toute seule


#1

Bonsoir à tous,
Je viens vers vous car je suis devant un soucis que je n’arrive pas à gérer :

Dans SafetyFirst, j’ai ajouté un AlertViewController dans la gestion du mot de passe principale quand celui-ci est inférieur à 6 caractères :

@IBAction func saveAndCloseButton(_ sender: Any) {
    savePassword()
    dismiss(animated: true, completion: nil) // retourne à l'écran précédent.
}

private func savePassword() {
    if let password = getTypedPassword()
    {
        // si tout est bon, le manager sauvegarde le password.
        SafeBoxManager().saveMasterPassword(password)
    }
}

private func getTypedPassword() -> String? {
let password:String?
if let password1 = ui_passwordField1.text,
    let password2 = ui_passwordField2.text,
    password1.count > 5,
    password1 == password2
{
    password = password1
} else {
    password = nil
    beCarefull(presentedViewController: self) // je lance une UIAlertViewController
}
return password
}

func beCarefull (presentedViewController : UIViewController!) {
    let alertController = UIAlertController(title: "Attention", message: "Le mot de passe doit avoir 6 caractères minimum et/ou la vérification ne correspond pas au mot de passe saisi.", preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "Fermer", style: .default, handler: nil))
    present(alertController, animated: true, completion: nil)
}

Sauf que quand je veux changer le mot de passe et qu’il n’est pas bon, j’ai bien la UIAlertController qui s’affiche mais se referme 1seconde après.

Comment faire pour attendre que l’utilisateur clique sur le bouton Fermer ?


#2

Hello,

Ton soucis réside dans le fait que tu execute un dismiss quoi qu’il arrive.
Et le dismiss ferme l’alert.

Par exemple ceci fonctionne :

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func onClick(_ sender: Any) {
        // etape 1 : vérifie que le mot de passe est correctement renseigné. si ce n'est pas le cas, alerte et fin des opérations.
        if(!checkPassword()) {
            showAlert()
            return
        }
        // Etape 2
        //On arrive ici que si le mot de passe est correct
        //Donc si on a l'alert, pas de dismiss, ni de save
        
        savePassword()
        dismiss(animated: true, completion: nil) // retourne à l'écran précédent.
    }
    
    private func checkPassword() -> Bool {
        //do your stuff here (taille, caractères, champs bien répété...) et tu retourne tru ou false
        return false
    }
    
    private func savePassword() {
        //do your stuff here
    }
    
    func showAlert () {
        let alertController = UIAlertController(title: "Attention", message: "Le mot de passe doit avoir 6 caractères minimum et/ou la vérification ne correspond pas au mot de passe saisi.", preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Fermer", style: .default, handler: nil))
        present(alertController, animated: true, completion: nil)
    }
}

#3

Merci Bcp @gaveline !
Où avais-je la tête ?
J’y vois bien plus clair en effet et j’ai résolu mon soucis.