This post is part of my collection: Swift 2 – For Beginners.
Swift extensions add new functionality to an existing class, structure, enumeration, or protocol type.
In this example we will see how to write a UIViewController extension to show loading indicators and alerts.
To add a class extensions we have to write something like:
extension UIViewController { // write your extensions here }
Show a loading indicator
Our first extension method will be a method that should show a loading indicator and disable the application so that the user cannot interact with it. To help the user understand that the application is disabled it should be grayed out.
To use this method we don’t need any parameter but we need a reference to the created indicator to hide it later:
var spinner = self.showModalSpinner()
To do this we can use the class UIActivityIndicatorView.
/** Shows a loading indicator and disables user interaction with the app until it is hidden */ func showModalSpinner() ->UIActivityIndicatorView{ // user cannot interact with the app while the spinner is visible UIApplication.sharedApplication().beginIgnoringInteractionEvents() var indicator = UIActivityIndicatorView() indicator = UIActivityIndicatorView(frame: self.view.frame) indicator.center = self.view.center indicator.backgroundColor = UIColor(white: 0.0, alpha: 0.5) indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray indicator.hidesWhenStopped = true indicator.startAnimating() self.view.addSubview(indicator) return indicator }
Now we need a method to hide the spinner when our task was completed:
self.hideModalSpinner(self.spinnerView)
/** Hides the loading indicator and enables user interaction with the app */ func hideModalSpinner(indicator: UIActivityIndicatorView){ indicator.stopAnimating() indicator.hidden = true // user can interact again with the app UIApplication.sharedApplication().endIgnoringInteractionEvents() }
If we put these two methods within a UIViewController extension we can use them like a normal method of the class.
Show an alert
Let’s add now a method to our extension to show an alert to the user, it should have an ‘ok’ button that will close the alert when the user taps it.
I would like to have a very simple method that has only two parameters to indicate the title and message:
self.showAlert("Error", message: "Invalid user name / password.")
We can use the class UIAlertController to do that:
/** Shows an alert with a title and a message */ func showAlert(title: String, message:String) { let alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) // show the alert with a "ok" button that will close the alert let okAction = UIAlertAction(title: "ok", style: UIAlertActionStyle.Default) { (action) -> Void in self.dismissViewControllerAnimated(true, completion: nil) } alertController.addAction(okAction) // show alert controller self.presentViewController(alertController, animated: true, completion: nil) }
Complete example:
import UIKit extension UIViewController{ /** Shows an alert with a title and a message */ func showAlert(title: String, message:String) { let alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) // show the alert with a "ok" button that will close the alert let okAction = UIAlertAction(title: "ok", style: UIAlertActionStyle.Default) { (action)-> Void in self.dismissViewControllerAnimated(true, completion: nil) } alertController.addAction(okAction) // show alert controller self.presentViewController(alertController, animated: true, completion: nil) } /** Shows a loading indicator and disables user interaction with the app until it is hidden */ func showModalSpinner()->UIActivityIndicatorView{ // user cannot interact with the app while the spinner is visible UIApplication.sharedApplication().beginIgnoringInteractionEvents() var indicator = UIActivityIndicatorView() indicator = UIActivityIndicatorView(frame: self.view.frame) indicator.center = self.view.center indicator.backgroundColor = UIColor(white: 0.0, alpha: 0.5) indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray indicator.hidesWhenStopped = true indicator.startAnimating() self.view.addSubview(indicator) return indicator } /** Hides the loading indicator and enables user interaction with the app */ func hideModalSpinner(indicator: UIActivityIndicatorView){ indicator.stopAnimating() indicator.hidden = true // user can interact again with the app UIApplication.sharedApplication().endIgnoringInteractionEvents() } }