Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add TextField to UIAlertController in Swift

I am trying to show a UIAlertController with a UITextView. When I add the line:

    //Add text field     alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in     }         

I get a Runtime error:

fatal error: unexpectedly found nil while unwrapping an Optional value

    let alertController: UIAlertController = UIAlertController(title: "Find image", message: "Search for image", preferredStyle: .Alert)      //cancel button     let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in         //cancel code     }     alertController.addAction(cancelAction)      //Create an optional action     let nextAction: UIAlertAction = UIAlertAction(title: "Search", style: .Default) { action -> Void in         let text = (alertController.textFields?.first as! UITextField).text         println("You entered \(text)")     }     alertController.addAction(nextAction)      //Add text field     alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in         textField.textColor = UIColor.greenColor()     }     //Present the AlertController     presentViewController(alertController, animated: true, completion: nil) 

This is presented inside my ViewController via an IBAction.

I have downloaded the code from here and it works fine. I copied and pasted that method into my code and it breaks. The presence of self on the last line has no impact.

like image 839
Quintin Balsdon Avatar asked Aug 10 '15 14:08

Quintin Balsdon


1 Answers

Swift 5.1

alert.addTextField { (textField) in     textField.placeholder = "Enter First Name" } 

Use this code, I am running this code in my app successfully.

@IBAction func addButtonClicked(sender : AnyObject){     let alertController = UIAlertController(title: "Add New Name", message: "", preferredStyle: UIAlertControllerStyle.Alert)     alertController.addTextFieldWithConfigurationHandler { (textField : UITextField!) -> Void in         textField.placeholder = "Enter Second Name"     }     let saveAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.Default, handler: { alert -> Void in         let firstTextField = alertController.textFields![0] as UITextField         let secondTextField = alertController.textFields![1] as UITextField     })     let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: {         (action : UIAlertAction!) -> Void in })     alertController.addTextFieldWithConfigurationHandler { (textField : UITextField!) -> Void in         textField.placeholder = "Enter First Name"     }          alertController.addAction(saveAction)     alertController.addAction(cancelAction)          self.presentViewController(alertController, animated: true, completion: nil) } 

Edited: Swift 3.0 version

@IBAction func addButtonClicked(_ sender: UIButton){     let alertController = UIAlertController(title: "Add New Name", message: "", preferredStyle: .alert)     alertController.addTextField { (textField : UITextField!) -> Void in         textField.placeholder = "Enter Second Name"     }     let saveAction = UIAlertAction(title: "Save", style: .default, handler: { alert -> Void in         let firstTextField = alertController.textFields![0] as UITextField         let secondTextField = alertController.textFields![1] as UITextField         print("firstName \(firstTextField.text), secondName \(secondTextField.text)")     })     let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: { (action : UIAlertAction!) -> Void in })     alertController.addTextField { (textField : UITextField!) -> Void in         textField.placeholder = "Enter First Name"     }      alertController.addAction(saveAction)     alertController.addAction(cancelAction)          self.present(alertController, animated: true, completion: nil) } 
like image 72
Himanshu Mahajan Avatar answered Oct 01 '22 03:10

Himanshu Mahajan