traba teclados teclado para descargar cambiar aparece iphone ios ipad uitextfield uikeyboard

iphone - teclados - ¿Hay alguna manera de evitar que el teclado se descarte?



teclado iphone descargar (6)

Solución vieja no perfecta

Solo puedo pensar en una solución no perfecta. Escuche la notificación UIKeyboardDidHideNotification y UIKeyboardDidHideNotification hacer de los primeros campos de los campos de texto. Esto moverá el teclado fuera de la vista y viceversa. Podrías mantener el registro de qué campo de texto fue el último primer Respondedor al escuchar UIKeyboardWillHideNotification y poner el foco en él en didHide.

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

Me doy cuenta de que esto es lo contrario de la mayoría de las publicaciones, pero me gustaría que el teclado permanezca activo incluso si se presiona el botón "bajar el teclado" .

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

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

Puedo mantener el teclado en alto incluso si el usuario presiona el botón Done en el teclado o toca en cualquier otro lugar de la pantalla, EXCEPTO para ese molesto botón para bajar el teclado en la parte inferior derecha del teclado.

Estoy usando esta vista como una vista modal (aunque la vista está asociada a un ViewController que se inserta en un UINavigationController), por lo que realmente funciona mejor desde la perspectiva del usuario para mantener el teclado activo todo el tiempo. Si alguien sabe cómo lograr esto, ¡por favor hágamelo saber! ¡Gracias!

ACTUALIZACIÓN ¡ Todavía no hay solución! Cuando se presiona Done , desencadena textFieldShouldReturn , pero cuando se presiona el botón de Dismiss , desencadena textFieldDidEndEditing . No puedo bloquear el textField no termine la edición o nunca desaparece. De alguna manera, realmente quiero tener un método que detecte el botón de Dismiss y lo ignore. Si conoces un camino, ¡por favor ilumíname!


Creo que encontré una buena solución.

Agregue un BOOL como variable de instancia, llamémosle shouldBeginCalledBeforeHand

Luego implementa los siguientes métodos:

- (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 teclado desaparezca con el botón de retorno. El truco es que un cambio de foco de un campo de texto a otro activará textFieldShouldBeginEditing de antemano. Si se presiona el botón para cerrar el teclado, esto no sucede. La bandera se reinicia después de que un campo de texto se ha enfocado.


Intente agregar una personalización en la parte superior del botón de descarte del teclado para que el usuario no pueda tabular el botón de descartar. 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 sharedApplication] 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]; } } }


Para iOS 9/10 y Swift 3, use esto para crear un rect que se superpone con el "Ocultar teclado" - Botón

override func viewDidLoad() { NotificationCenter.default.addObserver(self, selector: #selector(coverKey), name: .UIKeyboardDidShow, object: nil) } func coverKey() { if let keyboardWindow = UIApplication.shared.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 cuenta que esto agrega una vista secundaria a la ventana del teclado en lugar de la ventana principal


Prueba esto...

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

Puede usar la notificación mencionada por Nick Weaver.


Hay una forma de hacer esto. Debido a que UIKeyboard subclases UIWindow , lo único lo suficientemente grande como para obtener en el camino de UIWindow 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 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 de mem en myWindow . Por lo tanto, considere hacer eso también.