Как предотвратить UIKeyboard от анимации и обратно после отклонения UIAlertView

Мне интересно, если бы какие-либо разработчики iOS столкнулись с этой проблемой и могли бы предложить решение. Это связано с поведением UIKeyboard, поскольку оно относится к UITextView и UIAlertView.

В приложении нажатие UITextView вызывает UIKeyboard. Нажатие кнопки в аксессуаре UITextView вызывает UIAlertView с типом UIAlertViewStyleLoginAndPasswordInput. Пока все хорошо.

Вот в чем проблема: отклонение UIAlertView заставляет UIKeyboard анимироваться, а затем снова, когда UITextView снова становится первым ответчиком. Желаемое поведение – пропустить анимацию. Вызов [textView getFirstResponder] в методах UIAlertViewDelegate, похоже, не делает этого.

Ниже приведен пример проекта, который иллюстрирует поведение, а соответствующий фрагмент кода и журнал публикуются ниже.

Мысли об этом?

- (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *alertButton = [[UIBarButtonItem alloc] initWithTitle:@"Alert" style:UIBarButtonItemStyleBordered target:self action:@selector(handleAlertButtonTapped:)]; UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(handleDoneButtonTapped:)]; UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 44.0)]; toolbar.barStyle = UIBarStyleBlack; toolbar.items = @[alertButton, spacer, doneButton]; UIView *accessoryView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 44.0)]; [accessoryView addSubview:toolbar]; textView.inputAccessoryView = toolbar; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; } - (void)handleAlertButtonTapped:(id)sender { NSLog(@"%@", NSStringFromSelector(_cmd)); UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Styled AlertView" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alertView setAlertViewStyle:UIAlertViewStyleLoginAndPasswordInput]; [alertView show]; } - (void)handleDoneButtonTapped:(id)sender { [textView resignFirstResponder]; } #pragma mark - #pragma mark TextView Delegate Methods - (BOOL)textViewShouldEndEditing:(UITextView *)textView { NSLog(@"%@", NSStringFromSelector(_cmd)); return YES; } - (void)textViewDidEndEditing:(UITextView *)textView { NSLog(@"%@", NSStringFromSelector(_cmd)); } #pragma mark - #pragma mark AlertView Delegate methods - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { NSLog(@"%@", NSStringFromSelector(_cmd)); [textView becomeFirstResponder]; // Not a solution. } - (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex { NSLog(@"%@", NSStringFromSelector(_cmd)); [textView becomeFirstResponder]; // Not a solution. } - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { NSLog(@"%@", NSStringFromSelector(_cmd)); [textView becomeFirstResponder]; // Not a solution. } #pragma mark - #pragma mark Keyboard Notification Methods - (void)handleKeyboardWillShow:(NSNotification *)notification { NSLog(@"%@", NSStringFromSelector(_cmd)); [textView becomeFirstResponder]; // Not a solution. } - (void)handleKeyboardDidShow:(NSNotification *)notification { NSLog(@"%@", NSStringFromSelector(_cmd)); [textView becomeFirstResponder]; // Not a solution. } - (void)handleKeyboardWillHide:(NSNotification *)notification { NSLog(@"%@", NSStringFromSelector(_cmd)); [textView becomeFirstResponder]; // Not a solution. } - (void)handleKeyboardDidHide:(NSNotification *)notification { NSLog(@"%@", NSStringFromSelector(_cmd)); [textView becomeFirstResponder]; // Not a solution. } 

И результат журналов выглядит примерно так:

 ResponderTest[1228:11303] handleKeyboardWillShow: ResponderTest[1228:11303] handleKeyboardDidShow: ResponderTest[1228:11303] handleAlertButtonTapped: ResponderTest[1228:11303] handleKeyboardWillShow: ResponderTest[1228:11303] handleKeyboardDidShow: ResponderTest[1228:11303] alertView:clickedButtonAtIndex: ResponderTest[1228:11303] alertView:willDismissWithButtonIndex: ResponderTest[1228:11303] handleKeyboardWillHide: ResponderTest[1228:11303] handleKeyboardDidHide: ResponderTest[1228:11303] handleKeyboardWillShow: ResponderTest[1228:11303] handleKeyboardDidShow: ResponderTest[1228:11303] handleKeyboardWillHide: ResponderTest[1228:11303] handleKeyboardDidHide: ResponderTest[1228:11303] handleKeyboardWillShow: ResponderTest[1228:11303] alertView:didDismissWithButtonIndex: ResponderTest[1228:11303] handleKeyboardDidShow: 

Если я не понял вашу структуру приложения, кажется, что вы слишком усложняете ситуацию со всеми этими resignFirstResponder и startFirstResponder для UIAlertView.

По сути, вы получили UIAlertView с полями Username и Password, да?

Добавьте UIToolBar с кнопкой «Готово», которая имеет метод обратного вызова:

 // ------------------------------------------ // Setup keyboard done button as input // accessory view for your two fields // ------------------------------------------ UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; [toolBar setBarStyle:UIBarStyleBlackTranslucent]; UIButton *btnDone = [[UIButton alloc] initWithFrame:CGRectMake(230, 4, 66, 35)]; [btnDone setImage:[UIImage imageNamed:@"btnDoneOff.png"] forState:UIControlStateNormal]; [btnDone setImage:[UIImage imageNamed:@"btnDoneOn.png"] forState:UIControlStateHighlighted]; // ------------------------------------------ // Done button calls hideKeyboard method // when tapped, this is the only place you // need to call resign first responder // ------------------------------------------ [btnDone addTarget:self action:@selector(hideKeyboard) forControlEvents:UIControlEventTouchUpInside]; [toolBar addSubview:btnDone]; [btnDone release]; fldUsername.inputAccessoryView = toolBar; fldPassword.inputAccessoryView = toolBar; ... // ------------------------------------------ // Resigns first responder for the two fields // ------------------------------------------ -(void)hideKeyboard { [fldUsername resignFirstResponder]; [fldPassword resignFirstResponder]; } 

Выполняя это так, вы можете нажать либо поле имени пользователя, либо поле пароля, клавиатура не должна отклоняться. Когда вы закончите вводить имя пользователя и пароль, нажатие кнопки «Готово» на экране вспомогательного устройства клавиатуры приведет к скрытию клавиатуры, не заставляя клавиатуру вставлять и выходить из нее.

  • UITextView вызывает сбой приложения при вызове функции startFirstRender
  • adjustsFontSizeToFitWidth Не работает, когда текст редактируется
  • Как определить состояние автокоррекции UITextView?
  • Как установить поля (дополнение) в NSAttributedString?
  • «Self.delegate = self» не работает на iOS, используя ARC
  • Как скрыть UIButton во время прокрутки textView
  • iOS: «Сообщение отправлено на освобожденный экземпляр» при отставке первого ответчика в UITextView, когда отображается всплывающее окно автоматической коррекции
  • Как я могу выполнить выравнивание и выравнивание по левому краю в текстовом виде / веб-просмотре
  • Перерисовывание выделения UITextView после изменения стиля абзаца
  • UITextVew коснитесь середины слова и поместите курсор туда
  • Программно писать текст в UITextView
  • Давайте будем гением компьютера.