Je présente un UIAlertViewController sans aucun bouton, car il est censé simplement informer les utilisateurs que le téléchargement est en cours. L'application est censée télécharger certains fichiers sur Amazon S3 (certaines choses se produisent sur des threads parallèles) et je crains que la référence au contrôleur de vue d'alerte ne soit perdue lorsque je souhaite le supprimer.
Une idée sur ce qui pourrait être faux? Je ne sais même pas comment déboguer ceci car il n'y a pas d'erreur dans la zone de débogage?
J'ai une propriété de niveau de classe: var uploadInProgressAlert = UIAlertController()
J'utilise ce code pour présenter mon alerte sans boutons (ça marche):
self.uploadInProgressAlert = UIAlertController(title: "Uploading", message: "Please wait.", preferredStyle: .Alert)
self.presentViewController(self.uploadInProgressAlert, animated: true, completion: nil)
Ce code est destiné à ignorer l'alerte (l'alerte ne sera pas ignorée): self.uploadInProgressAlert.dismissViewControllerAnimated(false, completion: nil)
Dans ce fil de discussion: iOS congédie UIAlertController en réponse à un événement quelqu'un a parlé de "conserver la référence". Je ne sais pas ce que cela signifie "tenir la référence" et je pense que cela pourrait être la racine du problème.
EDIT: J'ai mis le code ci-dessus dans une application de test simple et voilà. Mais quand les choses se compliquent avec des threads parallèles, je ne peux pas trouver un moyen de rejeter l'alerte.
var delay4s = NSTimer()
var delay8s = NSTimer()
var alert = UIAlertController()
func showAlert() {
if NSClassFromString("UIAlertController") != nil {
alert = UIAlertController(title: "Uploading", message: "Please wait! \n\n", preferredStyle: UIAlertControllerStyle.Alert)
self.presentViewController(alert, animated: true, completion: nil)
}
}
func dismissAlert(){
self.alert.dismissViewControllerAnimated(true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
delay4s = NSTimer.scheduledTimerWithTimeInterval(4.0, target: self, selector: "showAlert", userInfo: nil, repeats: false)
delay8s = NSTimer.scheduledTimerWithTimeInterval(8.0, target: self, selector: "dismissAlert", userInfo: nil, repeats: false)
}
Généralement, le contrôleur de vue parent est responsable de la suppression du contrôleur de vue à présentation modale (votre fenêtre contextuelle). En Objective-C, vous feriez quelque chose comme ceci dans le contrôleur de vue parent:
[self dismissViewControllerAnimated:YES completion:nil];
Le même code dans Swift versions <3 serait:
self.dismissViewControllerAnimated(true, completion: nil)
Swift 3.0:
self.dismiss(animated: true, completion: nil)
pour Swift vous pouvez faire:
nameOfYourAlertController.dismiss(animated: true, completion: nil)
true animera la disparition et false supprimera abruptement l'alerte
Si vous souhaitez publier une alerte qui s'affiche brièvement, puis se ferme, vous pouvez utiliser la méthode suivante:
func postAlert(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
self.present(alert, animated: true, completion: nil)
// delays execution of code to dismiss
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: {
alert.dismiss(animated: true, completion: nil)
})
}
Utilisez la propre méthode de alertController pour se détruire.
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:...];
[alertController dismissViewControllerAnimated:YES completion:nil];
Rien ci-dessus ne semblait fonctionner, mais voici ce qui fonctionne parfaitement pour moi (xcode 10, Swift 5). Enjoy!
Étape 1: Placez ceci est votre classe viewController
var newQuestionAlert:UIAlertController?
Étape 2: Créer une fonction pour afficher une alerte
func ShowNewQuestionPopup() {
if newQuestionAlert == nil {
newQuestionAlert = UIAlertController(title: "Notice", message: "Next Question Starting", preferredStyle: .alert)
if let newQuestionAlert = newQuestionAlert {
newQuestionAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
self.newQuestionAlert = nil
return
}))
self.present(newQuestionAlert, animated: true, completion: nil)
}
}
}
Étape 3: Créer une fonction pour rejeter l'alerte
func autoDismiss() {
newQuestionAlert?.dismiss(animated: false, completion: nil)
newQuestionAlert = nil
}
Étape 4: Appelez les fonctions au besoin