How to add TextField to UIAlertController in Swift

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

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: http://sourcefreeze.com/uialertcontroller-ios-8-using-swift/ 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.

回答1:

Swift 4

alert.addTextField(configurationHandler: { (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) } 


回答2:

To add a text field in Swift 3.0:

let alertController = UIAlertController(title: "Title", message: "", preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Save", style: .default, handler: { alert -> Void in     let textField = alertController.textFields![0] as UITextField     // do something with textField })) alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) alertController.addTextField(configurationHandler: {(textField : UITextField!) -> Void in     textField.placeholder = "Search" })    self.present(alertController, animated: true, completion: nil) 


回答3:

So I started checking to see what could possibly have been different in my code to the working code. I noticed that my ViewController extends

UITextFieldDelegate 

Which apparently means that I need to set the delegate of any child UITextView:

alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in         searchTextField = textField         searchTextField?.delegate = self //REQUIRED         searchTextField?.placeholder = "Enter your search terms" } 


回答4:

How to add textField to AlertView? Let's keep it short and simple.

This works for Swift 3.0 and above.

var nameField: UITextField? let alertController = UIAlertController(title: "Add Number", message: nil, preferredStyle: .alert) // Add textfield to alert view alertController.addTextField { (textField) in     nameField = textField } 

First, you instantiate an object of UIAlertController and then you add a text field to it by accessing addTextField member of UIAlertController class.



回答5:

Great answer a slight modification to show how the textfield can be used:

func addRow (row: Int, bodin: String, flag: Int) {     let alertController = UIAlertController(title: bodin, message: "", preferredStyle: .alert)     alertController.addAction(UIAlertAction(title: "Save", style: .default, handler: {         alert -> Void in         _ = alertController.textFields![0] as UITextField      }))     alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))      alertController.addTextField(configurationHandler: {(textField : UITextField!) -> Void in         switch flag {         case 0:             textField.keyboardType = UIKeyboardType.phonePad             textField.placeholder = "Enter Number"         case 1:             textField.keyboardType = UIKeyboardType.emailAddress             textField.placeholder = "Enter Email"         default:             break         }      }) 


回答6:

add TextField to UIAlertController and TextField text Display on UILabel in Swift

let alert = UIAlertController(title: "Alert", message: "", preferredStyle: .alert)  alert.addTextField { (textField) in textField.placeholder = "First Name" } alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in let textField = alert?.textFields![0] self.label.text = textField?.text  }))  self.present(alert, animated: true, completion: nil) 


回答7:

For Swift 4.0, You can use this sample of code succesfully tested in my project:

@IBAction func withdrawTapped(_ sender: UIButton) {    let alertController = UIAlertController(title: "Token withdraw", message: "", preferredStyle: .alert)    let withdrawAction = UIAlertAction(title: "Withdraw", style: .default) { (aciton) in      let text = alertController.textFields!.first!.text!      if !text.isEmpty {       self.presentAlert(         title: "Succesful",          message: "You made request for withdraw \(textField.text) tokens")     }   }    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (action) in   }    alertController.addTextField { (textField) in     textField.placeholder = "999"     textField.keyboardType = .decimalPad   }    alertController.addAction(withdrawAction)   alertController.addAction(cancelAction)    self.present(alertController, animated: true, completion: nil) } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!