Próbuję pokazać a UIAlertController
z UITextView
. Kiedy dodam linię:
//Add text field
alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in
}
Wyskakuje mi Runtime
błąd:
błąd krytyczny: nieoczekiwanie znaleziono zero podczas rozpakowywania wartości opcjonalnej
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)
Jest to prezentowane w moim ViewController
za pośrednictwem pliku IBAction
.
Pobrałem kod stąd i działa dobrze. Skopiowałem i wkleiłem tę metodę do mojego kodu i się psuje. Obecność siebie w ostatniej linii nie ma żadnego wpływu.
ios
swift
uitextfield
uialertcontroller
Quintin Balsdon
źródło
źródło
UITextField
, a nieUITextView
?Odpowiedzi:
Swift 5.1
alert.addTextField { (textField) in textField.placeholder = "Enter First Name" }
Użyj tego kodu, pomyślnie uruchamiam ten kod w mojej aplikacji.
@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) }
Edytowano: wersja 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) }
źródło
Aby dodać pole tekstowe w 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)
źródło
Zacząłem więc sprawdzać, co mogło być inne w moim kodzie niż działający kod. Zauważyłem, że mój ViewController się rozszerza
UITextFieldDelegate
Co najwyraźniej oznacza, że muszę ustawić delegata dowolnego podrzędnego UITextView:
alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in searchTextField = textField searchTextField?.delegate = self //REQUIRED searchTextField?.placeholder = "Enter your search terms" }
źródło
Rozwiązanie:
Swift 4.2
Wypróbuj poniższe linie i zobacz, czy działa:
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)
Mam nadzieję, że to pomoże.
źródło
alertController.addTextField
poprawna? Wygląda na to, że „Drugie imię” pojawi się nad „Imię”.Jak dodać textField do AlertView? Niech to będzie krótkie i proste.
Działa to w wersji Swift 3.0 i nowszych.
var nameField: UITextField? let alertController = UIAlertController(title: "Add Number", message: nil, preferredStyle: .alert) // Add textfield to alert view alertController.addTextField { (textField) in nameField = textField }
Najpierw tworzysz instancję obiektu,
UIAlertController
a następnie dodajesz do niego pole tekstowe, uzyskując dostęp doaddTextField
elementu członkowskiegoUIAlertController
klasy.źródło
Aby dodać alertController z jednym textField (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) }
źródło
W przypadku Swift 4.0 możesz użyć tej próbki kodu pomyślnie przetestowanej w moim projekcie:
@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) }
źródło
W Swift 4.2 i Xcode 10.1
Alert z dwoma polami tekstowymi i odczytem danych tekstowych TextField oraz prezentuj alert w górnej części wszystkich widoków .
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) }
Jeśli chcesz zaprezentować aleert na szczycie wszystkich widoków.
Tutaj z powyższego kodu usuń ostatnią linię
self.present(alert, animated:true, completion: nil)
i dodaj poniższy kod.//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)
Teraz dzwoń w ten sposób
alertWithTF(title: "This is title", message: "This is message")
źródło
Świetna odpowiedź, niewielka modyfikacja, aby pokazać, jak można używać pola tekstowego:
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 } })
źródło
dodaj TextField do UIAlertController i TextField Display Text na UILabel w 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)
źródło
UIAlertController
zUITextfield
najnowszą wersją Apple Swift 5.1.3Utwórz
lazy
zmienną oUIAlertController
w swojejUIViewController
, dodaćUITextFieldDelegate
, Show Alert onUIButton
działania :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 } }
Miłego kodowania !! :)
źródło
Swift5
Pierwsza klasa jest zgodna z UITextFieldDelegate, a następnie utwórz nową właściwość 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)
Dzięki
źródło
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) }
Szybki 5
źródło