web-dev-qa-db-fra.com

Avertissement: Tentative de présentation de <UIAlertController: 0x7facd3946920> sur <...> qui présente déjà (null)

J'ai un long geste de presse défini sur une UITableView qui présente une UIAlertController contenant le texte de la cellule. Lorsque la UIAlertController est présentée, je reçois cet avertissement: 

Attempt to present <UIAlertController: 0x7fd57384e8e0>  on <TaskAppV2.MainTaskView: 0x7fd571701150> which is already presenting (null)

De ma compréhension, MainTaskView (la UITableView) présente déjà une vue. Il ne devrait donc pas en présenter une seconde, le UIAlertController.. J'ai donc essayé this solution à partir d'une question similaire. Cela ne fonctionne pas car je reçois le même avertissement. Que puis-je faire pour résoudre cet avertissement? Voir ci-dessous pour le code:

func longPressedView(gestureRecognizer: UIGestureRecognizer){

    /*Get cell info from where user tapped*/
    if (gestureRecognizer.state == UIGestureRecognizerState.Ended) {
        var tapLocation: CGPoint = gestureRecognizer.locationInView(self.tableView)

        var tappedIndexPath: NSIndexPath? = self.tableView.indexPathForRowAtPoint(tapLocation)
        if (tappedIndexPath != nil) {
            var tappedCell: UITableViewCell? = self.tableView.cellForRowAtIndexPath(tappedIndexPath!)
            println("the cell task name is \(tappedCell!.textLabel!.text!)")
        } else {
            println("You didn't tap on a cell")
        }
    }

    /*Long press alert*/
    let tapAlert = UIAlertController(title: "Long Pressed", message: "You just long pressed the long press view", preferredStyle: UIAlertControllerStyle.Alert)
    tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
    /*
    if (self.presentedViewController == nil) {
        self.presentViewController(tapAlert, animated: true, completion: nil)
    } else {
        println("already presenting a view")
    } */

    self.presentViewController(tapAlert, animated: true, completion: nil)
    println("presented")
}

Sortie de la console: 

presented
You didn't tap on a cell
2015-05-19 22:46:35.692 TaskAppV2[60765:3235207] Warning: Attempt to present <UIAlertController: 0x7fc689e05d80>  on <TaskAppV2.MainTaskView: 0x7fc689fc33f0> which is already presenting (null)
presented

Pour une raison quelconque, les deux morceaux de code sont exécutés dans l'instruction if lorsque le geste de pression long se produit. L'alerte est présentée et le texte est imprimé sur la console. Est-ce un problème?

Edit: Comme Matt l'a dit, je n'avais pas tout mon code dans le cadre du test de reconnaissance des gestes. Déplacer cela dans résolu mon problème. Le code situé en dehors du test était exécuté deux fois, ce qui entraînait la présentation de la variable UIAlertController.

18
MortalMan

Pour une raison quelconque, les deux morceaux de code s'exécutent dans la variable if

Cela aurait dû sonner l'alarme pour moi. Il est impossible que if et else soient exécutés. Ce code doit être exécuté deux fois.

C’est parce que vous ne testez pas l’état de la reconnaissance de geste. Un appui long g.r. envoie son message d'action deux fois . Vous exécutez ce code à la fois sur la presse longue et sur le communiqué. Vous devez tester l'état de la g.r. afin que vous ne faites pas ça. Exemple:

@IBAction func longPressedView(g: UIGestureRecognizer) {
    if g.state == .Began {
        // ... do it all here
    }
}
17
matt

J'ai eu le même problème ... J'ai été capable de le réparer avec ce code:

        if self.presentedViewController == nil {
            self.present(Alert, animated: true, completion: nil)
        }
        else {
            self.dismiss(animated: false, completion: nil)
            self.present(Alert, animated: true, completion: nil)
        }
9
Dmitry Senashenko

Vous devez différencier l'état du geste, puis exécuter le code souhaité. Si le sélecteur ajouté à la cible n'est pas exécuté, la première fois que l'état du geste est UIGestureRecognizerStateBegan et la deuxième fois, lorsque l'état du geste est UIGestureRecognizerStateCancelled, la seconde représentation d'alerteController s'affiche. alors Xcode va enregistrer un avertissement.

0
Immanito