可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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) }