Клавиатура появляется после того, как UIAlertView уволен на iOS 8.3 для iPad
С последним выпуском iOS 8.3 наше приложение начинает иметь странное поведение.
После завершения редактирования текстового поля пользователь может нажать кнопку закрытия, которая вызывает UIAlertView
. Когда пользователь нажимает кнопку "Отбросить" в окне alertview, предупреждение и текущее представление отклоняются. Но почему-то клавиатура появляется после исчезновения представления, что очень раздражает пользователей.
После некоторой отладки кажется, что клавиатура показана для последнего текстового поля, к которому пользователь обратился, прежде чем закрывать представление. Я пробовал различные способы endEditing
для текущего представления во многих местах (перед показом UIAlertView
, после нажатия кнопки в UIAlertView
, я даже установил фокус на другой элемент пользовательского интерфейса представления). Это не решило проблему.
Но для этой конкретной проблемы я не уверен, что это общая проблема или что-то, что нам нужно исправить. Все работает отлично до iOS 8.3.
Мы понимаем, что UIAlertView
устарел для iOS 8. Мы начинаем мигрировать в UIAlertController
. Но если есть какое-то обходное решение, нам бы хотелось услышать.
Вот фрагмент кода.
- (IBAction)closeTapped:(UIButton *)sender
{
// try to resign first responder
// [self.tfName resignFirstResponder];
// [self.tfPosition resignFirstResponder];
[self.view endEditing:YES];
if(self.orderDetails.isOpen && self.orderItemChanged)
{
UIAlertView* saveAlert = [[UIAlertView alloc] initWithTitle:@"Unsaved Changes"
message:@"Your changes have not been saved. Discard changes?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Save", @"Discard", nil];
[saveAlert show];
}
else
{
[self close];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
switch(buttonIndex)
{
case 1: // Save
{
[self save];
break;
}
case 2: // Discard
{
[self close];
break;
}
}
}
- (void)close
{
[self.delegate dismissEditOrderItemVC];
}
Ответы
Ответ 1
Если целью развертывания является iOS 8+, попробуйте UIAlertController
.
Вот краткое исправление для UIAlertView
: задержка вызова отображения предупреждения, когда ваше текстовое поле или текстовое представление уходит в отставку с первого ответчика.
[self performSelector:@selector(showAlertView) withObject:nil afterDelay:0.6];
Ответ 2
Если кто-то борется с этим, я надеюсь, что это поможет:
if (NSClassFromString(@"UIAlertController")) {
UIAlertController* alert = ...
}
else {
UIAlertView* alert = ...
}
Ответ 3
вам нужно изменить оповещение для ios 8.3
сначала положите это на ваш взгляд
#define IS_IOS8 [[UIDevice currentDevice].systemVersion floatValue] >= 8.0
затем
if (IS_IOS8) {
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Unsaved Changes" message:@"Your changes have not been saved. Discard changes?" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *saveAction = [UIAlertAction
actionWithTitle:@"Save"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
[self save];
}];
UIAlertAction *cancelAction = [UIAlertAction
actionWithTitle:@"Cancel"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
[alertVC dismissViewControllerAnimated:YES completion:nil];
}];
UIAlertAction *discardAction = [UIAlertAction
actionWithTitle:@"Discard"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
[alertVC dismissViewControllerAnimated:YES completion:nil];
}];
[alertVC addAction:saveAction];
[alertVC addAction:cancelAction];
[alertVC addAction:discardAction];
[self.view.window.rootViewController presentViewController:alertVC animated:YES completion:nil];
это поможет вам, так как это помогает мне в одной и той же проблеме.
выше код совместим как с ios 7, так и с 8
Ответ 4
Если текстовое поле является первым ответчиком, оно автоматически выведет клавиатуру, когда предупреждение будет отклонено. Убедитесь, что первый ответчик должным образом уволен с помощью:
[textField resignFirstResponder]
Помните: в представлении таблицы или прокрутки иногда поле должно быть видимым на экране, чтобы должным образом отключить ответчика.
Если активных ответчиков нет, клавиатура не должна появляться, когда предупреждение отклонено.
Для конкретного случая в этом вопросе я бы рекомендовал установить метод делегата для прослушивания кнопки "done" и отставки первого ответчика в обратном вызове делегата.
В качестве альтернативы, при начале редактирования вы можете сохранить ссылку на текущее текстовое поле, а затем в методе "clickedButtonAtIndex" вы можете отменить активное текстовое поле, если оно еще активно.
Ответ 5
Попробуйте использовать приведенный ниже код. Он отлично работает для iOS 8 и ниже версии
if (IS_OS_8_OR_LATER) {
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction
actionWithTitle:@"OK"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
}];
[alertVC addAction:cancelAction];
[[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{
}];
}
else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
}
}
Ответ 6
Я заметил какое-то странное поведение с клавиатурами textField и alertViews... Возможно, сделайте bool с именем disableKeyboard и используйте его вот так:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
if (disableKeyBoard) {
disableKeyboard = NO;
return NO;
} else {
return YES;
}
}
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {
disableKeyboard = YES;
}
Это всего лишь обходное решение и не затрагивает основной вопрос, каким бы он ни был. Чтобы этот метод работал, вам нужно установить методы делегата alertView и textField в свой заголовок.
Ответ 7
У меня тоже появилась клавиатура (с курсором в последнем использованном текстовом элементе) после закрытия UIAlertController и вот очень простое исправление:
Непосредственно перед созданием и представлением UIAlertController,
Использование [_activeTextView resignFirstResponder]; клавиатура снова появится.
Использование [self.view endEditing: YES]; клавиатура НЕ появится снова.
Надеюсь, это поможет вам.