xcode - resignFirstResponder no oculta el teclado en textFieldShouldReturn
ipad ios4 (14)
¿Recordó implementar el protocolo UITextFieldDelegate
?
Tengo una vista con un UITextField que debe ocultar el teclado cuando se presiona return.
Mi función es esta:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ( textField == userPassword ) {
[textField resignFirstResponder];
}
return YES;
}
Normalmente, el teclado debe estar oculto, pero permanece en la pantalla. resignFirstResponder se llama correctamente. ¿Qué me estoy perdiendo?
En función de su comentario de que parece que el foco ha cambiado, entonces creo que lo que puede estar pasando es que el teclado permanece abierto para el siguiente campo de entrada de texto. Si su tecla de retorno es una tecla "Siguiente", entonces devolver SÍ para textFieldShouldReturn: hará que el siguiente campo de texto sea el primero en responder, y mantendrá el teclado visible.
Esta solución funcionó para mí después de que ninguna de las anteriores lo hizo. Después de llamar a resignFirstResponder agregué una vista modal y la eliminé.
[myTextField resignFirstResponder];
UIViewController *dummyController = [[UIViewController alloc] init];
UIView *dummy = [[UIView alloc] initWithFrame:CGRectMake(-1, -1,1,1)];
[dummyController setView:dummy];
[self presentModalViewController:dummyController animated:NO];
[dummyController dismissModalViewControllerAnimated:NO];
Estaba teniendo el mismo problema. Me di cuenta de que después de conectar el delegado al propietario del archivo en Interface Builder, no lo guardé en Interface Builder. Una vez que guardé, volví a compilar y el teclado desaparece correctamente cuando toco return.
Existe este útil método que le permite cerrar el teclado al presentar el Diálogo Modal:
- (BOOL)disablesAutomaticKeyboardDismissal { return NO; }
Esto anulará el comportamiento predeterminado del diálogo modal establecido por Apple y le permitirá descartar el teclado. Está en la clase UIViewController.
¡Espero que esto ayude a alguien!
He leído tantos artículos sobre este tema, donde el teclado en pantalla se niega a ocultarse cuando llamas a resignFirstResponder
, pero ninguna de las sugerencias funcionó para mí.
Estoy usando XCode 5 (iOS 7) y tengo una pantalla de iPhone que contiene un par de controles que requieren el teclado en pantalla, pero si el usuario hace clic en el UIButton
, entonces quiero que el teclado desaparezca.
Probablemente perdí un día completo experimentando con resignFirstResponder
y agregando funciones resignFirstResponder
para devolver NO, pero nada funcionó. Una vez que apareció el teclado en pantalla, nunca más pude volver a desaparecer.
Pero luego tuve una pequeña onda cerebral (ya que solo tengo un cerebro pequeño).
Ahora, cuando el usuario hace clic en mi UIButton
, simplemente desactivo los controles UITextField
y UITextView
.
- (IBAction)btnDate_Tapped:(id)sender {
// The user has clicked on the "Date" button.
self.tbClientName.enabled = NO;
self.tbComments.editable = NO;
Y, de repente, la aplicación descubre que no tiene campos de texto editables que necesiten un teclado en pantalla, y desliza el teclado fácilmente fuera de la vista.
(Un suspiro de alivio)
Mi UIButton
realmente hace aparecer un cuadro de diálogo emergente. Cuando el usuario cierra la ventana emergente, vuelvo a habilitar estos dos controles, de modo que si el usuario toca uno de ellos, el teclado volverá a aparecer.
-(void)popoverControllerDidDismissPopover:(UIPopoverController *) popoverController {
// The user has closed our popup dialog.
// We need to make our UITextField and UITextView editable again.
self.tbClientName.enabled = YES;
self.tbComments.editable = YES;
... etc...
}
Simple, ¿no es así?
Y sorprendentemente, esta solución incluso funciona en UIViewControllers
que aparecen en estilo Modal .
Espero que esto ayude a otras víctimas de XCode por ahí.
La forma más fácil es:
Ve a tu constructor de interfaz de usuario,
seleccione
UITextField
y "Control-Arrastre" a "Detail View Controller-Detail" y suéltelo.La ventana emergente. Luego, en "Outlets", selecciona "Delegate".
Eso es. Funcionó para mí
Para lidiar con el error mencionado por Brandon, puede intentar cerrar y volver a abrir su controlador de vista modal siempre que todavía tenga una referencia.
[textField resignFirstResponder];
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:yourModalViewControllerReference animated:NO];
(donde "self" debería ser el controlador que utilizó para abrir originalmente el controlador de vista modal)
Si está utilizando Interface Builder, observe si su UITextField tiene el enlace delegado con su clase.
-Seleccione su UITextField y en su mirada Conexiones si sale una conexión en Outlets-> delegate. Si no, conect con usted Clase de propietario del archivo.
Esto debe vincularse con la clase de propietario de su archivo. Este delegado dice dónde buscar un método. Si está anulando un método, necesita indicar dónde buscará el objeto.
Si se encuentra en UIModalPresentationFormSheet, simplemente llame
- (BOOL)disablesAutomaticKeyboardDismissal
{
return NO;
}
Swift 3.0:
override var disablesAutomaticKeyboardDismissal: Bool {
get{
return false
}
set {
self.disablesAutomaticKeyboardDismissal = false
}
}
Veo que tienes la etiqueta del iPad en esto. ¿Está presentando una vista modal usando UIModalPresentationFormSheet? Si es así, parece que esto es una limitación de la presentación modal de FormSheet (ya sea que Apple lo haga intencionalmente por alguna razón, o es un error). Vea estas otras preguntas para más detalles:
El diálogo modal no descarta el teclado
Controlador de vista modal con teclado en el iPad de paisaje cambia de ubicación cuando se descarta
Swift 3.0
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField == addressTextField {
textField.resignFirstResponder()
return false
}
return true
}
xcode 4.5.1
Simplemente haga clic en el control y luego en el campo de texto arrastre y suelte en el archivo .h
( tecla de control + arrastre )
luego en el menú emergente seleccione
connection=acton;
name= any name;
type=id;
event=did end on exit;
arguments=sender;
luego haz clic en el botón de conexión