web-dev-qa-db-fra.com

Comment supprimer par programmation UIAlertController sans aucun bouton?

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)
}
31
Andrej

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)
53
JiuJitsuCoder

pour Swift vous pouvez faire:

nameOfYourAlertController.dismiss(animated: true, completion: nil)

true animera la disparition et false supprimera abruptement l'alerte

9
sandeep jaglan

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)
    })
  }
7
Adrian

Utilisez la propre méthode de alertController pour se détruire.

UIAlertController *alertController = [UIAlertController 
alertControllerWithTitle:...];

[alertController dismissViewControllerAnimated:YES completion:nil];
5
ylgwhyh

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

0
Stotch