¿Hay alguna forma de evitar que el keyboard se desconecte?

Me doy count de que este es el inverso de la mayoría de las publicaciones, pero me gustaría que el keyboard permanezca encendido incluso si se presiona el button 'keyboard abajo' .

Específicamente, tengo una vista con dos UITextField s. Con el siguiente método de delegado

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { return NO; } 

Puedo mantener el keyboard actualizado incluso si el usuario presiona el button Done en el keyboard o toca en cualquier otro lugar de la pantalla, EXCEPTO para el molesto button de keyboard abajo en la parte inferior derecha del keyboard.

Estoy usando esta vista como una vista modal (aunque la vista está asociada con un ViewController que se empuja en un UINavigationController), por lo que realmente funciona mejor desde la perspectiva del usuario para mantener el keyboard todo el time. Si alguien sabe cómo lograrlo, ¡házmelo saber! ¡Gracias!

ACTUALIZACIÓN ¡ Aún no hay solución! Cuando se presiona Done , activa textFieldShouldReturn , pero cuando se presiona el button Dismiss , desencadena textFieldDidEndEditing . No puedo bloquear el textField de textField de la edición final o nunca desaparece. De alguna manera, realmente quiero tener un método que detecte el button Dismiss y lo ignore. Si sabes una forma, por favor, ¡explícame!

Hay una forma de hacer esto. Debido a que UIKeyboard subclasss UIWindow , lo único que es lo suficientemente grande como para acceder a UIKeyboard es otra UIWindow .

 - (void)viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(coverKey) name:UIKeyboardDidShowNotification object:nil]; [super viewDidLoad]; } - (void)coverKey { CGRect r = [[UIScreen mainScreen] bounds]; UIWindow *myWindow = [[UIWindow alloc] initWithFrame:CGRectMake(r.size.width - 50 , r.size.height - 50, 50, 50)]; [myWindow setBackgroundColor:[UIColor clearColor]]; [super.view addSubview:myWindow]; [myWindow makeKeyAndVisible]; } 

Esto funciona en las aplicaciones de iPhone. No lo he probado con iPad. Es posible que deba ajustar el tamaño de myWindow . Además, no hice ninguna gestión mem en myWindow . Entonces, considere hacer eso también.

Creo que he encontrado una buena solución.

Agregue un BOOL como variable de instancia, llamémoslo shouldBeginCalledBeforeHand Llamado shouldBeginCalledBeforeHand

Luego implementa los siguientes methods:

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { shouldBeginCalledBeforeHand = YES; return YES; } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { return shouldBeginCalledBeforeHand; } - (void)textFieldDidBeginEditing:(UITextField *)textField { shouldBeginCalledBeforeHand = NO; } 

Tanto como

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { return NO; } 

para evitar que el keyboard desaparezca con el button de retorno. El truco es que un cambio de foco de un campo de text a otro activará un textFieldShouldBeginEditing de antemano. Si se presiona el button de rechazo del keyboard, esto no sucede. El indicador se reinicia después de que un campo de text haya recibido el foco.

Vieja solución no perfecta

Solo puedo pensar en una solución no perfecta. Escuche la notificación UIKeyboardDidHideNotification y UIKeyboardDidHideNotification hacer del campo de text el primero respondedor. Esto moverá el keyboard fuera de la vista y de nuevo. Podrías tener un logging de qué campo de text era el último primer respondedor al escuchar UIKeyboardWillHideNotification y centrarlo en itHide.

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; ... - (void)keyboardDidHide:(id)sender { [myTextField becomeFirstResponder]; } 

Para iOS 9/10 y Swift 3, usa esto para crear un rectángulo que se solapa con el "Ocultar keyboard" – Botón

 override func viewDidLoad() { NotificationCenter.default.addObserver(self, selector: #selector(coverKey), name: .UIKeyboardDidShow, object: nil) } func coverKey() { if let keyboardWindow = UIApplication.shanetworking.windows.last { let r = UIScreen.main.bounds let myWindow = UIWindow.init(frame: CGRect(x: r.size.width - 50 , y: r.size.height - 50, width: 50, height: 50)) myWindow.backgroundColor = UIColor.clear myWindow.isHidden = false keyboardWindow.addSubview(myWindow) keyboardWindow.bringSubview(toFront: myWindow) } } 

Tenga en count que esto agrega una vista secundaria a la window del keyboard en lugar de a la window principal

Intente agregar una costumbre en la parte superior del button de descarte del keyboard para que el usuario no pueda presionar el button de descarte. He usado este método en una de mis aplicaciones.

 - (void)addButtonToKeyboard { // create custom button UIButton *blockButton = [UIButton buttonWithType:UIButtonTypeCustom]; blockButton.frame = //set the frame here, I don't remember the exact frame [blockButton setImage:[UIImage imageNamed:@"block_button.png"] forState:UIControlStateNormal]; // locate keyboard view UIWindow *appWindows = [[[UIApplication shanetworkingApplication] windows] objectAtIndex:1]; UIView *keyboard; for (int i=0; i<[appWindows.subviews count]; i++) { keyboard = [appWindows.subviews objectAtIndex:i]; // keyboard found, add the button if ([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES && [self.textField isFirstResponder]) { [keyboard addSubview:doneButton]; } } } 

Prueba esto…

 - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{ return NO; } 

Puede usar la notificación como mencionó Nick Weaver.