2014-11-05 6 views
6

Sono nuovo per swift ma penso che mi sto prendendo una pausa. Questo però ha bloccato i miei progressi.self.navigationController? .popViewControllerAnimated from UIAlertController

Quello che voglio fare è lanciare un messaggio di errore all'utente quando non riusciamo a trovare i dati rilevanti nella sua query, e quindi procedere a riportarlo al ViewController precedente.

Tuttavia, sto avendo problemi a farlo. Sulla riga in cui aggiungo l'azione, viene visualizzato il seguente errore: 'UIViewController?' non è un sottotipo di Void

let alertController = UIAlertController(title: "Oops", message: "We couldn't find any data for this title, sorry!", preferredStyle: UIAlertControllerStyle.Alert) 

alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in 
    self.navigationController?.popViewControllerAnimated(true) 
})) 

Come si fa? Mi manca qualcosa di ovvio? Ho provato a scherzare con l'UIAlertView deprecato ma non ne sono diventato più saggio.

risposta

23

basta aggiungere un esplicito return economico nel corpo di chiusura:

alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in 
    self.navigationController?.popViewControllerAnimated(true) 
    return 
})) 

Il motivo per cui questo accade è che un singolo chiusura dichiarazione viene gestito come valore di ritorno, in modo che il compilatore utilizza il valore di ritorno di popViewControllerAnimated, il che non sorprende è un UIViewController?. La dichiarazione di ritorno esplicita lo evita.

Questo comportamento è documentato in Implicit Returns from Single-Expression Closures

+0

Grazie per la rapida risposta! Non riesco nemmeno a segnare la tua risposta come corretta ancora a causa del tempo minimo. –