ios - tamaño - teclado iphone 7
Aparece el teclado después de que se descarta UIAlertView en iOS 8.3 para iPad (7)
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.
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 en descartar en la vista de alerta, se descarta la vista de alerta y la vista actual. 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 maneras de endEditing
para la vista actual en muchos lugares (antes de mostrar UIAlertView
, luego 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 que 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];
}
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];
}
}
Si alguien tiene problemas con esto, espero que esto ayude:
if (NSClassFromString(@"UIAlertController")) {
UIAlertController* alert = ...
}
else {
UIAlertView* alert = ...
}
Si su destino de despliegue es iOS 8+, pruebe con UIAlertController
.
Aquí hay una solución rápida para UIAlertView
: demore la invocación de mostrar la vista de alerta cuando su campo de texto o vista de texto deja de responder primero.
[self performSelector:@selector(showAlertView) withObject:nil afterDelay:0.6];
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.
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.
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