How would I create a UIAlertView in Swift?

i0S Swift Issue

Question or problem with Swift language programming:

I have been working to create a UIAlertView in Swift, but for some reason I can’t get the statement right because I’m getting this error:

Here is how I have it written:

let button2Alert: UIAlertView = UIAlertView(title: "Title", message: "message",
                     delegate: self, cancelButtonTitle: "OK", otherButtonTitles: nil)

Then to call it I’m using:

button2Alert.show()

As of right now it is crashing and I just can’t seem to get the syntax right.

How to solve the problem:

Solution 1:

From the UIAlertView class:


// UIAlertView is deprecated. Use UIAlertController with a
preferredStyle of UIAlertControllerStyleAlert instead

On iOS 8, you can do this:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) 

Now UIAlertController is a single class for creating and interacting with what we knew as UIAlertViews and UIActionSheets on iOS 8.

Edit: To handle actions:

alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { action in switch action.style{ case .Default: print("default") case .Cancel: print("cancel") case .Destructive: print("destructive") } }})) 

Edit for Swift 3:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil)) self.present(alert, animated: true, completion: nil) 

Edit for Swift 4.x:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in switch action.style{ case .default: print("default") case .cancel: print("cancel") case .destructive: print("destructive") }})) self.present(alert, animated: true, completion: nil) 

Solution 2:

One Button

One Button Screenshot

class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertController.Style.alert) // add an action (button) alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil)) // show the alert self.present(alert, animated: true, completion: nil) } } 

Two Buttons

Two Button Alert Screenshot

class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "UIAlertController", message: "Would you like to continue learning how to use iOS alerts?", preferredStyle: UIAlertController.Style.alert) // add the actions (buttons) alert.addAction(UIAlertAction(title: "Continue", style: UIAlertAction.Style.default, handler: nil)) alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil)) // show the alert self.present(alert, animated: true, completion: nil) } } 

Three Buttons

enter image description here

class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "Notice", message: "Lauching this missile will destroy the entire universe. Is this what you intended to do?", preferredStyle: UIAlertController.Style.alert) // add the actions (buttons) alert.addAction(UIAlertAction(title: "Remind Me Tomorrow", style: UIAlertAction.Style.default, handler: nil)) alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil)) alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: nil)) // show the alert self.present(alert, animated: true, completion: nil) } } 

Handling Button Taps

The handler was nil in the above examples. You can replace nil with a closure to do something when the user taps a button. For example:

alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: { action in // do something like... self.launchMissile() })) 

Notes

  • Multiple buttons do not necessarily need to use different UIAlertAction.Style types. They could all be .default.
  • For more than three buttons consider using an Action Sheet. The setup is very similar. Here is an example.

Solution 3:

You can create a UIAlert using the standard constructor, but the ‘legacy’ one seems to not work:

let alert = UIAlertView() alert.title = "Alert" alert.message = "Here's a message" alert.addButtonWithTitle("Understood") alert.show() 

Solution 4:

In Swift 4.2 and Xcode 10

Method 1 :

SIMPLE ALERT

let alert = UIAlertController(title: "Your title", message: "Your message", preferredStyle: .alert) let ok = UIAlertAction(title: "OK", style: .default, handler: { action in }) alert.addAction(ok) let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in }) alert.addAction(cancel) DispatchQueue.main.async(execute: { self.present(alert, animated: true) }) 

Method 2 :

ALERT WITH SHARED CLASS

If you want Shared class style(Write once use every where)

import UIKit class SharedClass: NSObject {//This is shared class static let sharedInstance = SharedClass() //Show alert func alert(view: UIViewController, title: String, message: String) { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in }) alert.addAction(defaultAction) DispatchQueue.main.async(execute: { view.present(alert, animated: true) }) } private override init() { } } 

Now call alert like this in every ware

SharedClass.sharedInstance.alert(view: self, title: "Your title here", message: "Your message here") 

Method 3 :

PRESENT ALERT TOP OF ALL WINDOWS

If you want to present alert on top of all views, use this code

func alertWindow(title: String, message: String) { DispatchQueue.main.async(execute: { let alertWindow = UIWindow(frame: UIScreen.main.bounds) alertWindow.rootViewController = UIViewController() alertWindow.windowLevel = UIWindowLevelAlert + 1 let alert2 = UIAlertController(title: title, message: message, preferredStyle: .alert) let defaultAction2 = UIAlertAction(title: "OK", style: .default, handler: { action in }) alert2.addAction(defaultAction2) alertWindow.makeKeyAndVisible() alertWindow.rootViewController?.present(alert2, animated: true, completion: nil) }) } 

Function calling

SharedClass.sharedInstance.alertWindow(title:"This your title", message:"This is your message") 

Method 4 :

Alert with Extension

extension UIViewController { func showAlert(withTitle title: String, withMessage message:String) { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) let ok = UIAlertAction(title: "OK", style: .default, handler: { action in }) let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in }) alert.addAction(ok) alert.addAction(cancel) DispatchQueue.main.async(execute: { self.present(alert, animated: true) }) } } 

Now call like this

//Call showAlert function in your class @IBAction func onClickAlert(_ sender: UIButton) { showAlert(withTitle:"Your Title Here", withMessage: "YourCustomMessageHere") } 

Method 5 :

ALERT WITH TEXTFIELDS

If you want to add textfields to alert.

//Global variables var name:String? var login:String? //Call this function like this: alertWithTF() //Add textfields to alert func alertWithTF() { let alert = UIAlertController(title: "Login", message: "Enter username&password", preferredStyle: .alert) // Login button let loginAction = UIAlertAction(title: "Login", style: .default, handler: { (action) -> Void in // Get TextFields text let usernameTxt = alert.textFields![0] let passwordTxt = alert.textFields![1] //Asign textfileds text to our global varibles self.name = usernameTxt.text self.login = passwordTxt.text print("USERNAME: \(self.name!)\nPASSWORD: \(self.login!)") }) // Cancel button let cancel = UIAlertAction(title: "Cancel", style: .destructive, handler: { (action) -> Void in }) //1 textField for username alert.addTextField { (textField: UITextField) in textField.placeholder = "Enter username" //If required mention keyboard type, delegates, text sixe and font etc... //EX: textField.keyboardType = .default } //2nd textField for password alert.addTextField { (textField: UITextField) in textField.placeholder = "Enter password" textField.isSecureTextEntry = true } // Add actions alert.addAction(loginAction) alert.addAction(cancel) self.present(alert, animated: true, completion: nil) } 

Method 6:

Alert in SharedClass with Extension

//This is your shared class import UIKit class SharedClass: NSObject { static let sharedInstance = SharedClass() //Here write your code.... private override init() { } } //Alert function in shared class extension UIViewController { func showAlert(title: String, msg: String) { DispatchQueue.main.async { let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) } } } 

Now call directly like this

self.showAlert(title: "Your title here...", msg: "Your message here...") 

Method 7:

Alert with out shared class with Extension in separate class for alert.

Create one new Swift class, and import UIKit. Copy and paste below code.

//This is your Swift new class file import UIKit import Foundation extension UIAlertController { class func alert(title:String, msg:String, target: UIViewController) { let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default) { (result: UIAlertAction) -> Void in }) target.present(alert, animated: true, completion: nil) } } 

Now call alert function like this in all your classes (Single line).

UIAlertController.alert(title:"Title", msg:"Message", target: self) 

How is it….

Solution 5:

Click of View

@IBAction func testClick(sender: UIButton) { var uiAlert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertControllerStyle.Alert) self.presentViewController(uiAlert, animated: true, completion: nil) uiAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in println("Click of default button") })) uiAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { action in println("Click of cancel button") })) } 

Done with two buttons OK & Cancel

Hope this helps!