Подтвердить что ты не робот

Клавиатура появляется после того, как 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];
}
4b9b3361

Ответ 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]; клавиатура НЕ появится снова.

Надеюсь, это поможет вам.