Cómo agregar TextField UIAlertController en Swift

Estoy tratando de mostrar una UIAlertController con un UITextView. Al añadir la línea:

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

Tengo un Runtime de error:

fatal error: inesperadamente se encuentra con nil, mientras que desenvolver un valor Opcional

    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)

Esta se presenta dentro de mi ViewController a través de un IBAction.

He descargado el código de aquí y funciona bien. He copiado y pegado ese método en mi código y se rompe. La presencia de auto en la última línea no tiene ningún impacto.

  • UITextField, en lugar de UITextView ?

12 Kommentare

  1. 171

    Swift 4

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

    Utilizar este código, estoy ejecutando este código en mi aplicación con éxito.

    @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)
    }

    Editado: Swift versión 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)
    }
  2. 22

    Para agregar un campo de texto en 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. 11

    Así que me puse a revisar para ver lo que podría haber sido diferente, en mi código para el código de trabajo. Me di cuenta de que mi ViewController se extiende

    UITextFieldDelegate

    Que aparentemente significa que necesito para establecer el delegado de cualquier niño UITextView:

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

    Solución:

    Swift 4.2

    Tratar las siguientes líneas y ver si funciona:

    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: {
    (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)

    Espero que ayude.

    • Es el orden de los dos alertController.addTextField correcta? Parece como «Segundo Nombre» aparecería por encima de «Nombre».
  5. 4

    Cómo agregar textField AlertView? Vamos a mantenerlo corto y simple.

    Esto funciona para Swift 3.0 y superior.

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

    Primero, se crea la instancia de un objeto de UIAlertController y, a continuación, agregar un campo de texto para que al acceder a addTextField miembro de UIAlertController clase.

  6. 4

    Para agregar alertController con un 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)
    }
  7. 3

    En Swift y Xcode 4.2 10.1

    Alerta con dos campos de texto y Leer TextField de datos de texto y presente de alerta en la parte superior de todos los puntos de vista.

    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)
    
    }

    Si quieres presentar aleert en la parte superior de todas las vistas.

    Aquí de código anterior quitar esta última línea self.present(alert, animated:true, completion: nil) y añadir a continuación el código.

    //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)

    Ahora llamada como esta

    alertWithTF(title: "This is title", message: "This is message")
  8. 2

    Para Swift 4.0, puede utilizar este ejemplo de código probada con exito en mi proyecto:

    @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)
    }
  9. 1

    Gran responder a una ligera modificación para mostrar cómo el campo de texto se puede utilizar:

    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
            }
    
        })
  10. 1

    agregar TextField UIAlertController y TextField Visualización de texto en UILabel en 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)
  11. 0

    Swift5

    De primera clase se ajusta a la UITextFieldDelegate , a continuación, crear nuevas textField propiedad

        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)

    Gracias

  12. 0
    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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea