2014-09-25 1 views
12

Я пытаюсь использовать iOS 8 UIAlertController вместо того, где я бы использовал UIAlertView в прошлом. Я хочу, чтобы пользователь мог ввести текст в это предупреждение и нажать «ОК» для обработки текста или «Отмена» для отмены.UIAlertController с текстовым полем - нажатие кнопки возврата только скрывает клавиатуру, не выполняет действия?

Вот основной код:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Change Value" message:@"Enter your new value."]; 
[alert addTextFieldWithConfigurationHandler:nil]; 

[alert addAction: [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
    UITextField *textField = alert.textFields[0]; 
    NSLog(@"text was %@", textField.text); 
}]]; 

[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { 
    NSLog(@"Cancel pressed"); 
}]]; 

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

Со старым UIAlertView, я бы пометить его с alertViewStyle из UIAlertViewStylePlainTextInput. Затем, если пользователь нажал кнопку «Возврат» на клавиатуре после ввода текста, метод UIAlertViewDelegate willDismissWithButtonIndex: будет вызываться с некоторым buttonIndex (в зависимости от того, какие кнопки были указаны в UIAlertView).

В новом UIAlertController, если пользователь нажимает кнопки «ОК» или «Отмена», их соответствующие действия выполняются, как ожидалось; но если пользователь просто нажимает клавишу «Возврат» на клавиатуре, он просто скрывает клавиатуру, но предупреждение остается на экране, и никаких действий не выполняется.

Я думал о настройке текстового поля, чтобы установить UITextFieldDelegate к self, а затем, возможно переопределение метода textFieldDidReturn:, но я не знаю, есть ли способ, чтобы вызвать одну из действий UIAlertController «s программно. И в любом случае это звучит беспорядочно/хаки. Мне что-то не хватает?

+0

Я также не могу найти способ запускать действия программно. Какой надзор ... – elsurudo

ответ

0

Попробуйте это в iOS 8.0.2, возможно, оно исправлено. Мое текстовое поле запускает действие по умолчанию «ОК», даже не используя какое-либо делегирование.

+0

Даже не работает в iOS 9.2. Это определенно недосмотр. – elsurudo

1

Не идеальный ответ, но я закончил извлечение кода моего действия в метод и просто назвал этот метод как из действия, так и из метода textFieldDidReturn: в UITextFieldDelegate.

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 

    [self doAction:textField]; 
    [self dismissViewControllerAnimated:YES completion:NULL]; 

    return NO; 
} 
7

КСН 9.3, это происходит, когда у вас есть несколько действий с UIAlertActionStyleDefault стилем.

При добавлении одно действие с UIAlertActionStyleDefault и еще один с UIAlertActionStyleCancel, действие со стилем по умолчанию будет называться

0

Swift 3 Решение:

Убедитесь, что у вас есть только один вариант, как .DEFAULT. Я также узнал, что такое же неправильное поведение возникает при использовании одного .default и одного параметра .destructive ... не знаю, почему это происходит.

let cancelAction = UIAlertAction(title: "Discard", style: .cancel) { (_) -> Void in 
      self.invokedPullToAdd = false 
     } 
let submitAction = UIAlertAction(title: "Save", style: .default) { [unowned ac] _ in 
      let answer = ac.textFields![0] 
      if answer.text != "" { 
       self.addItem(name: answer.text!) 
       self.tableView.reloadData() 
      } else { 
       print ("WARNING: No input!") 
      } 
      self.invokedPullToAdd = false 
     } 
-1

Вы не должны устанавливать два "UIAlertActionStyleCancel" в UIAlertAction.

 Смежные вопросы

  • Нет связанных вопросов^_^