谁能告诉我如何UITextFields在内验证UIAlertController?
UITextFields
UIAlertController
我需要它来防止用户单击“保存”,除非同时输入了两个字段。
到目前为止,这是我的代码:
@IBAction func btnStart(sender: AnyObject) { var alert = UIAlertController(title: "New user", message: "Add a new user", preferredStyle: .Alert) let saveAction = UIAlertAction(title: "Save", style: .Default) { (action: UIAlertAction!) -> Void in self.textFieldName = alert.textFields![0] as UITextField self.textFieldEmail = alert.textFields![1] as UITextField self.saveUser(self.textFieldName.text, email: self.textFieldEmail.text) self.tableView.reloadData() } saveAction.enabled = false let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { (action: UIAlertAction!) -> Void in } alert.addTextFieldWithConfigurationHandler { (textFieldName: UITextField!) in textFieldName.placeholder = "Enter full name" } alert.addTextFieldWithConfigurationHandler { (textFieldEmail: UITextField!) in textFieldEmail.placeholder = "Enter valid email adress" textFieldEmail.keyboardType = .EmailAddress } alert.addAction(saveAction) alert.addAction(cancelAction) presentViewController(alert, animated: true, completion: nil) }
这是我用于验证电子邮件字段的功能:
func isValidEmail(testStr:String) -> Bool { let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" if let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) { return emailTest.evaluateWithObject(testStr) } return false }
这可以通过扩展UIAlertViewController:
UIAlertViewController
extension UIAlertController { func isValidEmail(_ email: String) -> Bool { return email.characters.count > 0 && NSPredicate(format: "self matches %@", "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,64}").evaluate(with: email) } func isValidPassword(_ password: String) -> Bool { return password.characters.count > 4 && password.rangeOfCharacter(from: .whitespacesAndNewlines) == nil } func textDidChangeInLoginAlert() { if let email = textFields?[0].text, let password = textFields?[1].text, let action = actions.last { action.isEnabled = isValidEmail(email) && isValidPassword(password) } } } // ViewController override func viewDidLoad() { super.viewDidLoad() let alert = UIAlertController(title: "Please Log In", message: nil, preferredStyle: .alert) alert.addTextField { $0.placeholder = "Email" $0.addTarget(alert, action: #selector(alert.textDidChangeInLoginAlert), for: .editingChanged) } alert.addTextField { $0.placeholder = "Password" $0.isSecureTextEntry = true $0.addTarget(alert, action: #selector(alert. textDidChangeInLoginAlert), for: .editingChanged) } alert.addAction(UIAlertAction(title: "Cancel", style: .cancel)) let loginAction = UIAlertAction(title: "Submit", style: .default) { [unowned self] _ in guard let email = alert.textFields?[0].text, let password = alert.textFields?[1].text else { return } // Should never happen // Perform login action } loginAction.isEnabled = false alert.addAction(loginAction) present(alert, animated: true) }