2015-08-06 16 views
18

Sto presentando un UIAlertViewController senza pulsanti, in quanto si suppone semplicemente informare gli utenti che il caricamento è in corso. L'app dovrebbe caricare alcuni file su Amazon S3 (alcune cose accadono su thread paralleli) e temo che il riferimento al controller della vista di avviso si perda quando voglio chiuderlo.Come licenziare programmaticamente UIAlertController senza alcun pulsante?

Qualche idea su cosa potrebbe essere sbagliato? Non so nemmeno come eseguire il debug di questo poiché non ci sono errori nell'area di Debug?

mi hanno una proprietà livello di classe: var uploadInProgressAlert = UIAlertController()

io uso questo codice per presentare il mio avviso senza tasti (funziona):

self.uploadInProgressAlert = UIAlertController(title: "Uploading", message: "Please wait.", preferredStyle: .Alert) 
self.presentViewController(self.uploadInProgressAlert, animated: true, completion: nil) 

Questo codice è quello di respingere l'avviso (l'avviso doesn' t get respinto): self.uploadInProgressAlert.dismissViewControllerAnimated(false, completion: nil)

In questa discussione: iOS dismiss UIAlertController in response to event qualcuno ha parlato di "detenere il riferimento". Non so cosa significhi "mantenere il riferimento" e penso che questo potrebbe essere la radice del problema.

MODIFICA: Ho inserito il codice precedente in una semplice app di test e lì funziona. Ma quando le cose si complicano con alcuni thread paralleli, non riesco a trovare un modo per chiudere l'avviso.

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

tenendo il riferimento è quello che stai facendo - rendere segnalazione un'istanza variabile – kostek

+1

In possesso di un riferimento è esattamente quello che hai fatto dichiarando una proprietà di classe 'uploadInProgressAlert'. Sei sicuro che la linea per il licenziamento sia mai stata chiamata? –

+0

Sì, sono sicuro che la linea viene chiamata, perché ho alcuni println() prima e dopo la linea. – Andrej

risposta

34

Generalmente il controllore della vista genitore è responsabile della revoca del controller di visualizzazione presentato in modo modale (il popup). In Objective-C si farebbe qualcosa di simile nel controller vista padre:

[self dismissViewControllerAnimated:YES completion:nil]; 

Lo stesso codice nelle versioni Swift < 3 sarebbe:

self.dismissViewControllerAnimated(true, completion: nil) 

Swift 3.0:

self.dismiss(animated: true, completion: nil) 
+3

Sì, questo in realtà mi ha indirizzato nella giusta direzione. Ho dovuto usare 'self.dismissViewControllerAnimated (false, completion: nil)' invece di 'self.uploadInProgressAlert.dismissViewControllerAnimated (false, completion: nil)'. Tuttavia non capisco perché funzioni, ma funziona. – Andrej

+3

Funziona perché come @MySpecialPurpose il controllore della vista genitore è responsabile per il respingimento di qualsiasi controller di vista presentato –

+2

A meno che .. un altro VC si presenti prima ... – Daniel

6

per swift si può fare:

nameOfYourAlertController.dismissViewControllerAnimated(true, completion: nil)

vero animerà la scomparsa, e il falso si bruscamente rimuovere l'avviso

2

uso proprio il metodo del alertController di distruggere se stessa.

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

[alertController dismissViewControllerAnimated:YES completion:nil]; 
+0

le risposte solo in codice non sono utili per la comunità. Spiega perché il tuo codice risolve il problema – JimHawkins

Problemi correlati