2016-02-09 15 views
5

In un progetto su cui sto lavorando, ho dovuto scrivere un modulo helper UIAlert che visualizzava i popup qui e là nella mia app iOS. I popup sono scritti come funzioni di classe che posso semplicemente chiamare ovunque nel codice (la classe è statica e quindi tutte le funzioni).UIAlertController - Azione non eseguita se l'avviso è stato chiuso la prima volta

ora sto incontrando un bug molto strano in cui, se si elimina un avviso una volta, quindi aprirlo di nuovo, le sue azioni non funzionano più (come nel caso, il gestore di azione non si chiama). Esso funziona se si sceglie l'azione per la prima volta viene visualizzato il popup, anche se ...

Ecco il codice per il pop-up specifico per il quale si verifica questo bug (nessun altro popup sono interessati di sorta):

static func popSkipWalkthrough() { 
    let alert = UIAlertController(title: "Skip", message: "whatever", preferredStyle: .Alert) 

    alert.addAction(cancelAction) 
    alert.addAction(skipWalkthroughAction) 
    appDelegate.window!.rootViewController!.presentViewController(alert, animated: true, completion: nil) 
} 

il skipWalkthroughAction è definito come segue:

static let skipWalkthroughAction = UIAlertAction(title: "Continue", style: .Default, handler: { (action: UIAlertAction!) -> Void in 
    appDelegate.setWindowViewTo("NavCtrl", navigateTo: false) 
    CallIn.Settings.didWalkthrough = true 
}) 

E il cancelAction è definito come:

static let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 

Questo popup, in particolare, viene mostrato ogni volta che si preme il tasto 'saltare' l'ultimo passo di un walk-through ...

ho provato un paio di cavi sulla quale sia la causa di questo comportamento è, e Penso che potrebbe avere qualcosa a che fare con il popup che non è stato davvero rilasciato, ma non sono affatto sicuro a questo punto ...

Qualche idea?

risposta

4

Tutti i problemi con il modo in cui questo pezzo riutilizzabile è codificato, questo problema può essere risolto inviando un messaggio copy: a skipWalkthroughAction. Basta fare un:

static func popSkipWalkthrough() { 
    let alert = UIAlertController(title: "Skip", message: "whatever", preferredStyle: .Alert) 

    alert.addAction(cancelAction.copy() as! UIAlertAction) 
    alert.addAction(skipWalkthroughAction.copy() as! UIAlertAction) 
    appDelegate.window!.rootViewController!.presentViewController(alert, animated: true, completion: nil) 
} 

Questo dovrebbe risolverlo.

È inoltre possibile risolvere questo spostando il livello alert a livello di istanza. Non è necessario inviare copy: quindi.

Meglio approccio

Se si desidera una "vera" esperienza riutilizzabile di UIAlertController, si sta meglio la creazione di un'estensione UIViewController. Ho questo in uno dei miei progetti:

extension UIViewController { 
    func showAlertControllerWithTitle(title:String?,message:String?,actions:[UIAlertAction],dismissingActionTitle:String?, dismissBlock:(() ->())?) -> UIAlertController { 
     let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) 
     if dismissingActionTitle != nil { 
      let okAction = UIAlertAction(title: dismissingActionTitle, style: .Default) { (action) -> Void in 
       dismissBlock?() 
       alertController.dismissViewControllerAnimated(true, completion:nil) 
      } 
      alertController.addAction(okAction) 
     } 
     for action in actions { 
      alertController.addAction(action) 
     } 
     self.presentViewController(alertController, animated: true, completion:nil) 
     return alertController 
    } 
} 
+0

Questo risolto! Grazie. Puoi anche spiegare perché hai problemi nel modo in cui l'ho scritto? C'è una soluzione migliore ? – Skwiggs

+1

@Skwiggs, vedere la modifica. – avismara

Problemi correlati