2015-05-20 7 views
16

Ho un gesto di pressione lunga impostato su un UITableView che presenta uno UIAlertController contenente il testo della cella. Quando il UIAlertController è presentato ottengo questo avvertimento:Avviso: tentativo di presentare <UIAlertController: 0x7facd3946920> su <...> che è già presente (null)

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

Dalla mia comprensione, MainTaskView (la UITableView) è già presenta una vista, quindi non dovrebbe presentare una seconda vista, il UIAlertController. così ho provato this soluzione da una domanda simile. Non funziona quando ricevo lo stesso avvertimento. Cosa posso fare per risolvere questo avvertimento? Vedi sotto per il codice:

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

uscita della 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 

Per qualche ragione, entrambi i pezzi di codice sono in esecuzione nel if quando il gesto pressione prolungata accade. L'avviso viene presentato e il testo viene stampato sulla console. È un problema?

Modifica: come ha detto Matt, non avevo tutto il mio codice nell'ambito del test di riconoscimento dei gesti. Spostando quello in risolto il mio problema. Il codice al di fuori del test è stato eseguito due volte, con la presentazione dello UIAlertController due volte.

+0

Possiamo vedere il codice rilevante? Visualizza * i controller * presentano altri * controller *, quindi il tuo UITableView non dovrebbe essere il problema. Sembra che tu stia mescolando un po 'le viste e i controller. – Connor

+0

La risposta accettata sulla domanda che hai collegato sembra abbastanza chiara. Puoi aggiungere del codice rilevante alla tua domanda? –

+0

Certo, dammi un paio di minuti. – MortalMan

risposta

16

Per qualche ragione, entrambi i pezzi di codice sono in esecuzione nel if

che dovrebbe avere suonato un campanello d'allarme per me. È impossibile eseguire sia if sia else. Questo codice deve essere in esecuzione due volte.

Questo perché si è non testare lo stato del riconoscitore di gesti. Una lunga stampa g.r. invia il suo messaggio di azione due volte. Stai eseguendo questo codice sia sulla lunga stampa che sulla versione. Devi testare lo stato della g.r. in modo da non farlo. Esempio:

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

L'unico altro 'presentViewController' che ho in questa classe è possibile solo mentre la tabella è in modalità di modifica. – MortalMan

+1

Genius! Ho messo un' println() 'sotto' presentViewController' e viene eseguito due volte a pressione prolungata. – MortalMan

+0

Ce l'ho. È perché non stai testando lo stato della lunga stampa. Ho rivisto la mia risposta (per l'ultima volta, penso). – matt

6

Ho avuto lo stesso problema. Sono stato in grado di risolvere il problema da questo codice:

 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) 
     } 
+1

Metti il ​​secondo presente all'interno del secondo gestore di completamento del respingere. –

0

Si dovrebbe distinguere lo stato gesto quindi eseguire il codice che si desidera, se non il selettore si aggiunge a bersaglio saranno eseguiti prima volta quando lo stato del gesto è UIGestureRecognizerStateBegan e la seconda volta quando lo stato del gesto è UIGestureRecognizerStateCancelled, la seconda prestazione, alertController viene visualizzata, quindi Xcode registrerà l'avviso.