Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

self.navigationController?.popViewControllerAnimated from UIAlertController

I'm new to swift but I think I'm getting a hang of it. This stumped my progress pretty hard though.

What I want to do is to throw an error message to the user when we can't find relevant data to his query, and then proceed to take him back to the previous ViewController.

However, I'm having real trouble doing this. On the line where I add the action I get the following error: 'UIViewController?' is not a subtype of 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)   
}))

How do I do this? Am I missing something obvious? I tried messing around with the deprecated UIAlertView but became none the wiser.

like image 751
Joakim Wimmerstedt Avatar asked Nov 05 '14 16:11

Joakim Wimmerstedt


1 Answers

Just add an explicit return statement in the closure body:

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

The reason why that happens is that a single statement closure is handled as the return value, so the compiler uses the return value of popViewControllerAnimated, which unsurprisingly is a UIViewController?. The explicit return statement avoids that.

This behavior is documented in Implicit Returns from Single-Expression Closures

like image 99
Antonio Avatar answered Nov 14 '22 05:11

Antonio