如何在UIAlertController中validationTextField?

谁能告诉我如何在UIAlertControllervalidationUITextFields

除非输入两个字段,否则我需要它来阻止用户点击“保存”。

这是我到目前为止的代码:

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

这是我validation电子邮件字段的function:

 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 } 

最优雅的方式是使用

 NotificationCenter.default.addObserver(forName: NSNotification.Name.UITextFieldTextDidChange... 

Swift 3.0示例

 let alert = UIAlertController(title: nil, message: nil, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) let saveAction = UIAlertAction(title:"Save", style: .destructive, handler: { (action) -> Void in }) alert.addAction(saveAction) alert.addTextField(configurationHandler: { (textField) in textField.placeholder = "Enter something" NotificationCenter.default.addObserver(forName: NSNotification.Name.UITextFieldTextDidChange, object: textField, queue: OperationQueue.main) { (notification) in saveAction.isEnabled = textField.text!.length > 0 } }) present(alert, animated: true, completion: nil) 

这可以通过扩展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) } 

在此处输入图像描述

这可以在显示警报控制器之前通过NSNotificationCenter实现,您只需要求通知中心观察UITextFieldTextDidChangeNotification的通知,您应该很好,

下面给出的是相同的实现

 @IBAction func showAlert(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 println("do your stuff here") } 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 } // adding the notification observer here NSNotificationCenter.defaultCenter().addObserverForName(UITextFieldTextDidChangeNotification, object:alert.textFields?[0], queue: NSOperationQueue.mainQueue()) { (notification) -> Void in let textFieldName = alert.textFields?[0] as! UITextField let textFieldEmail = alert.textFields![1] as! UITextField saveAction.enabled = self.isValidEmail(textFieldEmail.text) && !textFieldName.text.isEmpty } NSNotificationCenter.defaultCenter().addObserverForName(UITextFieldTextDidChangeNotification, object:alert.textFields?[1], queue: NSOperationQueue.mainQueue()) { (notification) -> Void in let textFieldEmail = alert.textFields?[1] as! UITextField let textFieldName = alert.textFields?[0] as! UITextField saveAction.enabled = self.isValidEmail(textFieldEmail.text) && !textFieldName.text.isEmpty } alert.addAction(saveAction) alert.addAction(cancelAction) presentViewController(alert, animated: true, completion: nil) } // email validation code method 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) as NSPredicate? { return emailTest.evaluateWithObject(testStr) } return false } 

您可以使用以下代码validationUIAlertController中的TextField: –

步骤1:

 Declare "email_TF" to your viewcontroller.h for example: @property(strong,nonatomic)UITextField *email_TF; 

第2步:

 UIAlertController *alert= [UIAlertController alertControllerWithTitle:@"Forgot Password?" message:nil preferredStyle:UIAlertControllerStyleAlert]; [alert addTextFieldWithConfigurationHandler: ^(UITextField *textField){ textField.placeholder= @"Enter Your Valid Email"; textField.autocorrectionType= UITextAutocorrectionTypeYes; textField.keyboardType= UIKeyboardTypeEmailAddress; email_TF= textField; }]; 

第3步:

 UIAlertAction *noButton= [UIAlertAction actionWithTitle:@"No, thanks" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action){ //Handel no, thanks button }]; [alert addAction:noButton]; UIAlertAction *yesButton= [UIAlertAction actionWithTitle:@"Yes, please" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ //Handel your yes please button action here NSLog(@"%@", email_TF.text); if(email_TF.text.length>0){// NSString *emailString= email_TF.text; NSString *emailReg= @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest= [NSPredicate predicateWithFormat:@"SELF MATCHES %@",emailReg]; if(([emailTest evaluateWithObject:emailString]!=YES) || [emailString isEqualToString:@""]){ UIAlertView *loginalert= [[UIAlertView alloc] initWithTitle:@"Forgot Password !" message:@"\nPlease enter valid Email (example@example.com format) ." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil]; [loginalert show]; }else{ NSLog(@"your TextField successfully validated"); } }else{ UIAlertView *alert= [[UIAlertView alloc] initWithTitle:@"Forgot Password !" message:@"\nPlease Enter Your Email..." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } }]; [alert addAction:yesButton]; 

步骤4:

 [self presentViewController:alert animated:YES completion:nil]; 

Swift 4.0示例

这是基于Mihael Isaev的回答。 我不得不稍微改变它以使“保存”按钮立即不活动。 我尝试使用和不使用占位符文本。 最后,不得不专门停用Save来开始。 就我而言,我选择使用警报标题而不是占位符文本。 但是,它的工作方式相同。

 let alert = UIAlertController(title: "Enter Username", message: nil, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) -> Void in})) let saveAction = UIAlertAction(title:"Save", style: .destructive, handler: { (action) -> Void in }) alert.addAction(saveAction) alert.addTextField(configurationHandler: { (textField) in textField.text = "" saveAction.isEnabled = false NotificationCenter.default.addObserver(forName: NSNotification.Name.UITextFieldTextDidChange, object: textField, queue: OperationQueue.main) { (notification) in saveAction.isEnabled = textField.text!.length > 0 } }) self.present(alert, animated: true, completion: nil) 

注册文本字段更改通知并validation其中的文本字段:

 //... alert.addTextFieldWithConfigurationHandler { (textFieldEmail: UITextField!) in textFieldEmail.placeholder = "Enter valid email adress" textFieldEmail.keyboardType = .EmailAddress } let textFieldValidationObserver: (NSNotification!) -> Void = { _ in let textFieldName = alert.textFields![0] as! UITextField let textFieldEmail = alert.textFields![1] as! UITextField saveAction.enabled = self.isValidEmail(textFieldEmail.text) && textFieldName.text.length > 0 } // Notifications for textFieldName changes NSNotificationCenter.defaultCenter().addObserverForName(UITextFieldTextDidChangeNotification, object: alert.textFields![0], // textFieldName queue: NSOperationQueue.mainQueue(), usingBlock: textFieldValidationObserver) // Notifications for textFieldEmail changes NSNotificationCenter.defaultCenter().addObserverForName(UITextFieldTextDidChangeNotification, object: alert.textFields![1], // textFieldEmail queue: NSOperationQueue.mainQueue(), usingBlock: textFieldValidationObserver) alert.addAction(saveAction) //... 

我实现了一个UIAlertController子类 ,它允许您在将文本字段更改添加到警报时添加处理程序:

 public class TextEnabledAlertController: UIAlertController { private var textFieldActions = [UITextField: ((UITextField)->Void)]() func addTextField(configurationHandler: ((UITextField) -> Void)? = nil, textChangeAction:((UITextField)->Void)?) { super.addTextField(configurationHandler: { (textField) in configurationHandler?(textField) if let textChangeAction = textChangeAction { self.textFieldActions[textField] = textChangeAction textField.addTarget(self, action: #selector(self.textFieldChanged), for: .editingChanged) } }) } @objc private func textFieldChanged(sender: UITextField) { if let textChangeAction = textFieldActions[sender] { textChangeAction(sender) } } } 

因此,对于您的情况,需要添加的唯一额外事情是在textChangeAction处理程序中调用isValidEmail函数:

  alert.addTextField(configurationHandler: { (textField) in // things you want to configure on the textfield }) { (textField) in saveAction.isEnabled = isValidEmail(textField.text ?? "") } 

遵循@Kupendiran为UIAlertController提供的电子邮件输入validation。 这是一个使用Objective-C和更新的UIAlertController格式的版本,因为UIAlertView现在已经过折旧。

步骤1.将以下内容添加到.h和.m文件中,包含其他属性和变量

。H

 @property(strong,nonatomic)UITextField *emailAddressField; 

.M

 UITextField *emailAddressField; 

步骤2.创建警报消息,按钮和validation过程。

 UIAlertController * alertView = [UIAlertController alertControllerWithTitle:@"E-Mail Address" message:@"Enter your email address:" preferredStyle:UIAlertControllerStyleAlert]; [alertView addTextFieldWithConfigurationHandler:^(UITextField *emailTextField) { emailTextField.placeholder = @"E-Mail Address"; emailTextField.autocorrectionType= UITextAutocorrectionTypeYes; emailTextField.keyboardType= UIKeyboardTypeEmailAddress; emailAddressField = emailTextField; }]; 

步骤3.创建警报操作

  UIAlertAction * ok= [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ //Handel your OK button action here NSLog(@"Email Address Entered is: %@", emailAddressField.text); //Validate email address is correct format if(emailAddressField.text.length>0){// NSString *emailString= emailAddressField.text; NSString *emailReg= @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest= [NSPredicate predicateWithFormat:@"SELF MATCHES %@",emailReg]; if(([emailTest evaluateWithObject:emailString]!=YES) || [emailString isEqualToString:@""]){ NSLog(@"Email Address Entered is not valid: %@", emailAddressField.text); UIAlertController *badEmailAlert = [UIAlertController alertControllerWithTitle:@"Email Address" message:@"\nPlease enter valid Email (example@example.com format) ." preferredStyle:UIAlertControllerStyleAlert]; [self presentViewController:badEmailAlert animated:YES completion:nil]; UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [badEmailAlert dismissViewControllerAnimated:YES completion:nil]; [self presentViewController:alertView animated:YES completion:nil]; }]; [badEmailAlert addAction:cancel]; }else{ NSLog(@"your TextField successfully validated"); } }else{ [self presentViewController:alertView animated:YES completion:nil]; } }]; [alertView addAction:ok]; //Handel your Cancel button action here UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [alertView dismissViewControllerAnimated:YES completion:nil]; }]; [alertView addAction:cancel]; 

步骤4.在屏幕上显示警报消息

 [self presentViewController:alertView animated:YES completion:nil]; 

首先,您需要在类中添加一些变量:

 private weak var saveAction : UIAlertAction? private weak var textFieldName : UITextField? private weak var textFieldEmail : UITextField? private var validName = false private var validEmail = false 

然后,当你想配置警报控制器时(我只粘贴了需要更改的东西):

  alert.addTextFieldWithConfigurationHandler { (textFieldName: UITextField!) in textFieldName.placeholder = "Enter full name" textFieldName.delegate = self self.textFieldName = textFieldName } alert.addTextFieldWithConfigurationHandler { (textFieldEmail: UITextField!) in textFieldEmail.placeholder = "Enter valid email adress" textFieldEmail.keyboardType = .EmailAddress textFieldEmail.delegate = self self.textFieldEmail = textFieldEmail } let saveAction = UIAlertAction(title: "Save", style: .Default) { (action: UIAlertAction!) -> Void in // here you are sure the name and email are correct let name = (alert.textFields[0] as! UITextField).text let email = (alert.textFields[1] as! UITextField).text } saveAction.enabled = false self.saveAction = saveAction 

最后,您应该实现此委托方法:

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let newText = NSString(string: textField.text).stringByReplacingCharactersInRange(range, withString: string) if textField == self.textFieldName { // validate newText for the name requirements validName = self.validateName(newText) } else if textField == self.textFieldEmail { // validate newText for the email requirements validEmail = self.validateEmail(newText) } self.saveAction?.enabled = validEmail && validName return true }