Pregunta Aparece el teclado después de que se descarta UIAlertView en iOS 8.3 para iPad


Con la última versión de iOS 8.3, nuestra aplicación comienza a tener un comportamiento extraño.

Después de terminar la edición del campo de texto, el usuario puede hacer clic en el botón de cerrar que muestra un UIAlertView. Cuando el usuario hace clic descarte en la vista de alerta, la vista de alerta y la vista actual se descartan. Pero de alguna manera, el teclado aparece después de que la vista se va, lo que es bastante molesto para los usuarios.

Después de algunas depuraciones, parece que el teclado se muestra para el último campo de texto al que el usuario ha accedido antes de cerrar la vista. Intenté varias formas de endEditing para la vista actual en muchos lugares (antes de mostrar UIAlertView, después de hacer clic en un botón en UIAlertView; Incluso configuré el foco en otro elemento de UI de la vista). No resolvió el problema.

Pero para este tema en particular, no estoy seguro de si es un problema común o algo que debemos solucionar. Todo funciona perfectamente antes de iOS 8.3.

Entendemos eso UIAlertView está en desuso para iOS 8. Estamos empezando a migrar a UIAlertController. Pero si hay alguna solución, nos encantaría escuchar.

Aquí hay un fragmento de código.

- (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];
}

32
2018-05-08 17:09


origen


Respuestas:


Si su destino de despliegue es iOS 8+, intente UIAlertController.

Aquí hay una solución rápida para UIAlertView: retrasa la invocación de mostrar la vista de alerta cuando su campo de texto o vista de texto renuncia a la primera respuesta.

[self performSelector:@selector(showAlertView) withObject:nil afterDelay:0.6];

14
2017-11-16 07:04



Si alguien tiene problemas con esto, espero que esto ayude:

if (NSClassFromString(@"UIAlertController")) {
    UIAlertController* alert = ...
}
else {
    UIAlertView* alert = ...
}

3
2018-06-04 12:17



necesitas cambiar la alerta para iOS 8.3

primero pon esto en tu vista

#define IS_IOS8 [[UIDevice currentDevice].systemVersion floatValue] >= 8.0

entonces

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];

esto te ayudará ya que me ayuda en el mismo problema. el código anterior es compatible con iOS 7 y 8


2
2017-07-08 07:21



Yo también, tuve un teclado apareciendo (con el cursor en el último textView usado) después de cerrar un UIAlertController y aquí hay una solución muy simple:

Inmediatamente antes de compilar y presentar el UIAlertController,

Usando [_activeTextView resignFirstResponder]; el teclado reaparecerá Usando [self.view endEditing: YES]; el teclado NO reaparecerá.

Espero que esto te ayude.


2
2018-05-08 20:57



Intenta usar el siguiente código. Funciona bien para iOS 8 y versiones inferiores

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];
    }

}


1
2017-08-19 16:51



Si un campo de texto es el primer respondedor, aparecerá automáticamente el teclado cuando se descarte la alerta. Asegúrese de que el primer respondedor sea despedido correctamente con:

[textField resignFirstResponder]

Recuerde: en una tabla o vista de desplazamiento, a veces el campo debe estar visible en la pantalla para despedir correctamente al respondedor.

Si no hay primeros intervinientes activos, el teclado no debería aparecer cuando se descarta la alerta.

Para el caso particular de esta pregunta, recomendaría establecer un método delegado para escuchar el botón "listo" y renunciar al primer respondedor en la devolución de llamada del delegado.

Alternativamente, al comenzar la edición, puede almacenar una referencia al campo de texto actualmente activo, luego en su método "clickedButtonAtIndex" puede renunciar al campo de texto activo si todavía está activo.


1
2018-05-08 18:15



He notado un comportamiento extraño con los teclados textField y alertViews también ... Tal vez crear un bool llamado disableKeyboard y usarlo así:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    if (disableKeyBoard) {

        disableKeyboard = NO;
        return NO;

    } else {

        return YES;

    }

}

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {

    disableKeyboard = YES;

}

Esto es solo una solución y no aborda el problema central, sea lo que sea. Para que este método funcione, debe establecer los métodos de delegado alertView y textField en su encabezado.


0
2018-05-08 18:09