El keyboard se oculta y se muestra de nuevo justo después de descartar UIActionSheet en iOS 7, SDK 7

Creo un UIActionSheet en mi ViewController. También agrego código para capturar la notificación UIKeyboardWillShowNotification y UIKeyboardWillHideNotification .

Mi problema es cuando rechazo, obtengo dos notifications de keyboard ocultas y vuelvo a mostrar . ¿Alguien puede mostrarme cómo prevenir ese problema? Solo ocurre en iOS 7 y se crea con SDK 7

Actualiza algún código:

En viewDidLoad, inicio un button, cuando se presiona el button táctil, se mostrará la hoja de acción.

- (void)viewDidLoad { [super viewDidLoad]; UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(10, 50, 100, 30); [button setTitle:@"Open menu" forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonTouched) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; UITextView* textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 100, 40)]; [self.view addSubview:textView]; [textView becomeFirstResponder]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; } - (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar{ [searchBar resignFirstResponder]; } - (void) buttonTouched{ UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:@"Action sheet" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Destructive" otherButtonTitles:@"Hello", nil]; [actionSheet showInView:self.view]; } - (void)keyboardWillShow:(NSNotification*)notification{ NSLog(@"keyboardWillShow"); } - (void)keyboardWillHide:(NSNotification*)notification{ NSLog(@"keyboardWillHide"); } 

Corro la aplicación, el keyboard mostrará, toque el button, se muestra la hoja de acciones. Salgo de la hoja de acción tocando cualquier button y la printing del logging:

keyboardWillShow

keyboardWillHide

keyboardWillShow

Hay una solución muy simple. Se debe agregar una categoría local privada en el file .m del controller

 @interface UIActionSheet (NonFirstResponder) @end @implementation UIActionSheet (NonFirstResponder) - (BOOL)canBecomeFirstResponder { return NO; } @end 

Existe el único efecto secundario. Tu texField / textView conserva el foco durante la presentación de la hoja de acción. Pero no es un gran problema, creo.

También se puede subclasificar UIActionSheet de la misma manera.

Está funcionando bien

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ if(textField==myTextField2){ [myTextField1 resignFirstResponder]; [self showActionSheet]; return NO; } return YES; }