I'm trying to make an alert controller with message and input, and then get the value from the input. I've found many good tutorials on how to make the input text field, but I can't get the value from the alert.
5 Answers
Updated for Swift 3 and above:
//1. Create the alert controller. let alert = UIAlertController(title: "Some Title", message: "Enter a text", preferredStyle: .alert) //2. Add the text field. You can configure it however you need. alert.addTextField { (textField) in textField.text = "Some default text" } // 3. Grab the value from the text field, and print it when the user clicks OK. alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in let textField = alert.textFields![0] // Force unwrapping because we know it exists. print("Text field: \(textField.text)") })) // 4. Present the alert. self.present(alert, animated: true, completion: nil) Swift 2.x
Assuming you want an action alert on iOS:
//1. Create the alert controller. var alert = UIAlertController(title: "Some Title", message: "Enter a text", preferredStyle: .Alert) //2. Add the text field. You can configure it however you need. alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in textField.text = "Some default text." }) //3. Grab the value from the text field, and print it when the user clicks OK. alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { [weak alert] (action) -> Void in let textField = alert.textFields![0] as UITextField println("Text field: \(textField.text)") })) // 4. Present the alert. self.presentViewController(alert, animated: true, completion: nil) 10 Comments
var keyword is if you were writing in Objective-C.[weak alert]? I'm looking at Swift 3.let textField = alert?.textFields![0] // Force unwrapping because we know it exists. print("Text field: \(textField?.text)")Swift 5
You can use the below extension for your convenience.
Usage inside a ViewController:
showInputDialog(title: "Add number", subtitle: "Please enter the new number below.", actionTitle: "Add", cancelTitle: "Cancel", inputPlaceholder: "New number", inputKeyboardType: .numberPad, actionHandler: { (input:String?) in print("The new number is \(input ?? "")") }) The extension code:
extension UIViewController { func showInputDialog(title:String? = nil, subtitle:String? = nil, actionTitle:String? = "Add", cancelTitle:String? = "Cancel", inputPlaceholder:String? = nil, inputKeyboardType:UIKeyboardType = UIKeyboardType.default, cancelHandler: ((UIAlertAction) -> Swift.Void)? = nil, actionHandler: ((_ text: String?) -> Void)? = nil) { let alert = UIAlertController(title: title, message: subtitle, preferredStyle: .alert) alert.addTextField { (textField:UITextField) in textField.placeholder = inputPlaceholder textField.keyboardType = inputKeyboardType } alert.addAction(UIAlertAction(title: actionTitle, style: .default, handler: { (action:UIAlertAction) in guard let textField = alert.textFields?.first else { actionHandler?(nil) return } actionHandler?(textField.text) })) alert.addAction(UIAlertAction(title: cancelTitle, style: .cancel, handler: cancelHandler)) self.present(alert, animated: true, completion: nil) } } 4 Comments
In Swift5 ans Xcode 10
Add two textfields with Save and Cancel actions and read TextFields text data
func alertWithTF() { //Step : 1 let alert = UIAlertController(title: "Great Title", message: "Please input something", preferredStyle: UIAlertController.Style.alert ) //Step : 2 let save = UIAlertAction(title: "Save", style: .default) { (alertAction) in let textField = alert.textFields![0] as UITextField let textField2 = alert.textFields![1] as UITextField if textField.text != "" { //Read TextFields text data print(textField.text!) print("TF 1 : \(textField.text!)") } else { print("TF 1 is Empty...") } if textField2.text != "" { print(textField2.text!) print("TF 2 : \(textField2.text!)") } else { print("TF 2 is Empty...") } } //Step : 3 //For first TF alert.addTextField { (textField) in textField.placeholder = "Enter your first name" textField.textColor = .red } //For second TF alert.addTextField { (textField) in textField.placeholder = "Enter your last name" textField.textColor = .blue } //Step : 4 alert.addAction(save) //Cancel action let cancel = UIAlertAction(title: "Cancel", style: .default) { (alertAction) in } alert.addAction(cancel) //OR single line action //alert.addAction(UIAlertAction(title: "Cancel", style: .default) { (alertAction) in }) self.present(alert, animated:true, completion: nil) } For more explanation https://medium.com/@chan.henryk/alert-controller-with-text-field-in-swift-3-bda7ac06026c
1 Comment
Swift version: 5.+
Create a new TextField variable in current scope and assign it to alertTextField in alert.addTextField completion handler. Use textField's value inside UIAlertAction completion handler.
@IBAction func addButtonPressed(_ sender: UIBarButtonItem) { //Variable to store alertTextField var textField = UITextField() let alert = UIAlertController(title: "Add new item", message: "", preferredStyle: .alert) alert.addTextField { alertTextField in alertTextField.placeholder = "Create new item" //Copy alertTextField in local variable to use in current block of code textField = alertTextField } let action = UIAlertAction(title: "Add item", style: .default) { action in //Prints the alertTextField's value print(textField.text!) } alert.addAction(action) present(alert, animated: true, completion: nil) } Comments
let ac = UIAlertController(title: "title", message: "message", preferredStyle: .alert) ac.addTextField() let submitAction = UIAlertAction(title: "Submit", style: .default) { [weak self, weak ac] action in guard let wordToget = ac?.textFields?[0].text else { return } //here you can do what you need like print(wordToget) } ac.addAction(submitAction) present(ac, animated: true)