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 UIAlertView
s and UIActionSheet
s 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
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
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
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