Я пытаюсь показать a UIAlertController
с a UITextView
. Когда я добавляю строку:
//Add text field
alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in
}
Я получаю Runtime
ошибку:
фатальная ошибка: неожиданно обнаружен ноль при разворачивании необязательного значения
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)
Это представлено внутри меня ViewController
через файл IBAction
.
Я скачал код отсюда, и он отлично работает. Я скопировал и вставил этот метод в свой код, и он сломался. Присутствие себя в последней строке не влияет.
ios
swift
uitextfield
uialertcontroller
Квинтин Болсдон
источник
источник
UITextField
, а неUITextView
?Ответы:
Swift 5.1
alert.addTextField { (textField) in textField.placeholder = "Enter First Name" }
Используйте этот код, я успешно запускаю этот код в своем приложении.
@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) }
Отредактировано: версия Swift 3.0
@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) }
источник
Чтобы добавить текстовое поле в 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)
источник
Поэтому я начал проверять, что могло отличаться в моем коде от рабочего. Я заметил, что мой ViewController расширяется
UITextFieldDelegate
Это, по-видимому, означает, что мне нужно установить делегат любого дочернего UITextView:
alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in searchTextField = textField searchTextField?.delegate = self //REQUIRED searchTextField?.placeholder = "Enter your search terms" }
источник
Решение:
Swift 4.2
Попробуйте следующие строки и посмотрите, работает ли это:
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 }) let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil ) alertController.addTextField { (textField : UITextField!) -> Void in textField.placeholder = "Enter First Name" } alertController.addAction(saveAction) alertController.addAction(cancelAction) self.present(alertController, animated: true, completion: nil)
Надеюсь, это поможет.
источник
alertController.addTextField
правил правильный? Кажется, что «Второе имя» появилось бы над «Первым именем».Как добавить текстовое поле в AlertView? Давайте будем краткими и простыми.
Это работает для Swift 3.0 и выше.
var nameField: UITextField? let alertController = UIAlertController(title: "Add Number", message: nil, preferredStyle: .alert) // Add textfield to alert view alertController.addTextField { (textField) in nameField = textField }
Сначала вы создаете экземпляр объекта,
UIAlertController
а затем добавляете к нему текстовое поле, обращаясь кaddTextField
членуUIAlertController
класса.источник
Чтобы добавить alertController с одним текстовым полем (Swift 5)
func openAlert(){ let alertController = UIAlertController(title: "Title", message: "", preferredStyle: .alert) alertController.addTextField { (textField : UITextField!) -> Void in textField.placeholder = "Enter name" } let saveAction = UIAlertAction(title: kAlertConfirm, style: .default, handler: { alert -> Void in if let textField = alertController.textFields?[0] { if textField.text!.count > 0 { print("Text :: \(textField.text ?? "")") } } }) let cancelAction = UIAlertAction(title: kAlertCancel, style: .default, handler: { (action : UIAlertAction!) -> Void in }) alertController.addAction(cancelAction) alertController.addAction(saveAction) alertController.preferredAction = saveAction self.present(alertController, animated: true, completion: nil) }
источник
Для Swift 4.0 вы можете использовать этот образец кода, успешно протестированный в моем проекте:
@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) }
источник
В Swift 4.2 и Xcode 10.1
Оповещение с двумя TextFields и текстовых данных Чтение TextField и настоящего предупреждения поверх всех просмотров .
func alertWithTF(title: String, message: String) { //Step : 1 let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert) //Step : 2 alert.addAction (UIAlertAction(title: "Save", style: .default) { (alertAction) in let textField = alert.textFields![0] let textField2 = alert.textFields![1] if textField.text != "" { //Read textfield data print(textField.text!) print("TF 1 : \(textField.text!)") } else { print("TF 1 is Empty...") } if textField2.text != "" { //Read textfield data 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 } //Cancel action alert.addAction(UIAlertAction(title: "Cancel", style: .default) { (alertAction) in }) self.present(alert, animated:true, completion: nil) }
Если вы хотите представить алерт поверх всех просмотров.
Здесь сверху код удалите эту последнюю строку
self.present(alert, animated:true, completion: nil)
и добавьте код ниже.//Present alert on top of all views. let alertWindow = UIWindow(frame: UIScreen.main.bounds) alertWindow.rootViewController = UIViewController() alertWindow.windowLevel = UIWindowLevelAlert + 1 alertWindow.makeKeyAndVisible() alertWindow.rootViewController?.present(alert, animated:true, completion: nil)
Теперь звони так
alertWithTF(title: "This is title", message: "This is message")
источник
Отличный ответ - небольшая модификация, чтобы показать, как можно использовать текстовое поле:
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 } })
источник
добавить TextField в UIAlertController и отображение текста TextField в UILabel в 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)
источник
UIAlertController
сUITextfield
последней версией Apple Swift 5.1.3Создайте
lazy
переменную изUIAlertController
вашейUIViewController
, добавитьUITextFieldDelegate
, Show оповещения оUIButton
действии :class YourViewController: UIViewController,UITextFieldDelegate { //Create Alert Controller Object here lazy var alertEmailAddEditView:UIAlertController = { let alert = UIAlertController(title:"My App", message: "Customize Add/Edit Email Pop Up", preferredStyle:UIAlertController.Style.alert) //ADD TEXT FIELD (YOU CAN ADD MULTIPLE TEXTFILED AS WELL) alert.addTextField { (textField : UITextField!) in textField.placeholder = "Enter emails" textField.delegate = self } //SAVE BUTTON let save = UIAlertAction(title: "Save", style: UIAlertAction.Style.default, handler: { saveAction -> Void in let textField = alert.textFields![0] as UITextField print("value entered by user in our textfield is: \(textField.text)") }) //CANCEL BUTTON let cancel = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.default, handler: { (action : UIAlertAction!) -> Void in }) alert.addAction(save) alert.addAction(cancel) return alert }() //MARK:- UIButton Action for showing Alert Controller @objc func buttonClicked(btn:UIButton){ self.present(alertEmailAddEditView, animated: true, completion: nil) } //MARK:- UITextFieldDelegate func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } }
Удачного кодирования !! :)
источник
Swift5
Первый класс соответствует UITextFieldDelegate, затем создайте новое свойство textField
private var myTextField : UITextField? // now where u want to add code let alertContoller = UIAlertController.init(title: "Add", message: "My message to user", preferredStyle: .alert) alertContoller.addTextField { (textField) in // make sure your outside any property should be accessed with self here self.myTextField = textField //Important step assign textfield delegate to self self.myTextField?.delegate = self self.myTextField?.placeholder = self.textFieldPlaceholderText } let action = UIAlertAction.init(title: "Ok", style: .default) { action in print("Alert tapped") } alertContoller.addAction(action) present(alertContoller, animated: true, completion:nil)
Благодарность
источник
private func showLoginAlert() { let loginAlert = UIAlertController(title: "Login Using Credentials", message: nil, preferredStyle: .alert) loginAlert.view.tintColor = .systemBlue loginAlert.addTextField { usernameField in usernameField.font = .systemFont(ofSize: 17.0) usernameField.placeholder = "Username" } loginAlert.addTextField { passwordField in passwordField.font = .systemFont(ofSize: 17.0) passwordField.isSecureTextEntry = true passwordField.placeholder = "Password" } let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: { _ in // self.handleUsernamePasswordCanceled(loginAlert: loginAlert) }) loginAlert.addAction(cancelAction) let loginAction = UIAlertAction(title: "Login", style: .default, handler: { _ in // self.handleUsernamePasswordEntered(loginAlert: loginAlert) }) loginAlert.addAction(loginAction) loginAlert.preferredAction = loginAction present(loginAlert, animated: true, completion: nil) }
Swift 5
источник