Включить UIAlertAction из UIAlertController только после ввода

Я использую UIAlertController для представления диалога с UITextField и одной кнопкой UIAlertAction надписью «Ok». Как отключить кнопку, пока в UITextField несколько символов (например, 5 символов)?

Добавьте в свой заголовочный файл следующее свойство

 @property(nonatomic, strong)UIAlertAction *okAction; 

затем скопируйте следующий код в свой метод ViewController вашего ViewController

 self.okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; self.okAction.enabled = NO; UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil message:@"Enter your text" preferredStyle:UIAlertControllerStyleAlert]; [controller addTextFieldWithConfigurationHandler:^(UITextField *textField) { textField.delegate = self; }]; [controller addAction:self.okAction]; [self presentViewController:controller animated:YES completion:nil]; 

Также примените следующий UITextField делегата UITextField в своем классе

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ NSString *finalString = [textField.text stringByReplacingCharactersInRange:range withString:string]; [self.okAction setEnabled:(finalString.length >= 5)]; return YES; } 

Это должно работать

Вы можете добавить наблюдателя в свой UITextField :

 [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { [textField addTarget:self action:@selector(alertControllerTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; } 

но сначала отключите свою кнопку:

 okAction.enabled = NO; 

Затем проверьте его в указанном вами методе:

 - (void)alertTextFieldDidChange:(UITextField *)sender { UIAlertController *alertController = (UIAlertController *)self.presentedViewController; if (alertController) { UITextField *someTextField = alertController.textFields.firstObject; UIAlertAction *okAction = alertController.actions.lastObject; okAction.enabled = someTextField.text.length > 2; } } 

Swift 3, основанный на ответе души :

 var someAlert: UIAlertController { let alert = UIAlertController(title: "Some Alert", message: nil, preferredStyle: .alert) alert.addTextField { $0.placeholder = "Write something" $0.addTarget(self, action: #selector(self.textFieldTextDidChange(_:)), for: .editingChanged) } alert.addAction(UIAlertAction(title: "Cancel", style: .cancel)) let submitAction = UIAlertAction(title: "Submit", style: .default) { _ in // Do something... } submitAction.isEnabled = false alert.addAction(submitAction) return alert } func textFieldTextDidChange(_ textField: UITextField) { if let alert = presentedViewController as? UIAlertController, let action = alert.actions.last, let text = textField.text { action.isEnabled = text.characters.count > 0 } } 

Лучшим подходом было бы предупредить пользователя о том, что не так с его вводом после проверки его ввода, так что пользователь знает, что приложение ожидает от него.

 - (void)askReasonWithPreviousReason:(NSString *)text { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Enter reason" preferredStyle:UIAlertControllerStyleAlert]; [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { textField.text = text; }]; [alertController addAction:[UIAlertAction actionWithTitle:@"Save" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { if ([self isReasonValid:alertController.textFields.firstObject.text]) { UIAlertController *alertController2 = [UIAlertController alertControllerWithTitle:AlertTitle message:@"Are you sure you would like to save?" preferredStyle:UIAlertControllerStyleAlert]; [alertController2 addAction:[UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [self saveReason:alertController.textFields.firstObject.text]; }]]; [alertController2 addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:Nil]]; [self presentViewController:alertController2 animated:YES completion:nil]; } }]]; [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:Nil]]; [self presentViewController:alertController animated:YES completion:nil]; } - (BOOL)isReasonValid:(NSString *)reason { NSString *errorMessage = [[NSString alloc] init]; if (reason.length < 5) { errorMessage = @"Reason must be more than 5 characters"; } else if (reason.length > 100) { errorMessage = @"Reason must be less than 100 characters"; } if (errorMessage.length != 0) { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert" message:errorMessage preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [self askReasonWithPreviousReason:reason]; }]]; [self presentViewController:alertController animated:YES completion:nil]; return NO; } return YES; } 

У меня был ответ на другой пост, в котором задавался тот же вопрос о stackoverflow. Подводя итог, есть несколько способов сделать это: использовать UITextFieldDelegate, Notification, KVO или просто добавить цель обработки событий в элемент управления. Мое решение – это простой подкласс UIAlertController, обернутый вокруг цели обработки событий, которую вы можете настроить, просто позвонив

  alert.addTextField(configurationHandler: { (textField) in textField.placeholder = "Your name" textField.autocapitalizationType = .words }) { (textField) in saveAction.isEnabled = (textField.text?.characters.count ?? 0) > 0 } 

Это должно быть удобно, если вам приходится иметь дело с такими предупреждениями более нескольких раз в проекте.

  • подтвердите номер телефона и электронную почту в том же тексте, который указан в объекте c
  • Различия между `.EditingDidEnd` и` .EditingDidEndOnExit`
  • Скольжение в uitextfield
  • Скрыть текстовую кнопку UISearchBar
  • Логика для перемещения текстового поля над клавиатурой
  • Могу ли я обнаружить ключ удаления, даже если UITextField пуст?
  • iOS: создать UITextField, например, код проверки подлинности WhatsApp TextField?
  • Добавление пробела между символом текстового поля при вводе текста
  • измерьте amout adjustsFontSizeToFitWidth для UILabel или textField
  • iOS: Как отправить ключ в UITextField?
  • Отключить курсор и скопировать / вставить в UITextView (быстрый)
  • Давайте будем гением компьютера.