2011-05-11 9 views
9

podemos establecer esta propiedad de UITextField a "Enviar", "Buscar", "Go", etc .:¿Puedo cambiar la propiedad UIReturnKeyType of UITextField de forma dinámica?

@property(nonatomic) UIReturnKeyType returnKeyType 

Pero su creación durante el uso de la UITextField no cambia en absoluto.

Quiero este comportamiento: Cuando UITextField está vacío, deje que returnKeyType sea "Volver", de lo contrario, deje que returnKeyType sea "Enviar".

Respuesta

17

Normalmente, el returnKeyType y otras propiedades se comprueban cuando se muestra el teclado, pero no se supervisan para actualizaciones posteriores. Intente llamar al reloadInputViews en el campo de texto después de cambiar el returnKeyType, que debe indicarle que actualice la configuración del teclado.

+0

Parece que funciona. Gracias. – yehnan

+0

No funciona en iOS 9: prueba http: // stackoverflow.com/a/19405954/1633251 –

7

Desafortunadamente, -[reloadInputViews] estropeará la entrada del teclado en los teclados de dos bytes.

Los teclados de dos bytes (Kanji por ejemplo) colocan caracteres temporales en el campo de texto y requieren que el usuario presione una tecla secundaria para confirmar el carácter ingresado. Llamar al -[reloadInputViews] abandona el estado del teclado secundario.

No he encontrado una solución para este escenario.

+0

El teclado se restablece cuando se llama a reloadInputViews en textField, que lo cambia a la configuración predeterminada de textField, por ejemplo, al pasar de la entrada de número a la entrada de correo electrónico. Puede minimizar la frecuencia con la que esto sucede solo llamando a reloadInputViews IF si cambia el tipo de clave de retorno. Ver mi respuesta a continuación para el código. –

+0

Llamando '[textField resignFirstResponder]; [textView becomeFirstResponder]; ', uno después del otro, actualizará el teclado sin una animación. – cnotethegr8

1

Como dijo Animie, la mejor manera es reloadInputViews para decirle al teclado sobre los cambios.

Se puede hacer así:

- (void)textFieldDidBeginEditing:(UITextField *)textField{ 

if(self.myTextField.editing){ 

     self.myTextField.editing.returnKeyType = UIReturnKeyNext;// or UIReturnKeyGo, etc. 

    } 
} 

En algún lugar de su código, en viewDidLoad por ejemplo, registro de UIKeyboardWillShowNotification:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 

Y cuando el teclado se muestra, que reloadInputViews:

- (void)keyboardWillShow:(NSNotification *)notification{ 
    [self.myTextField reloadInputViews]; 

} 
2

Algunos han propuesto llamar a reloadInputViews en el campo de texto para forzar la tecla de retorno del teclado para actualizar. Lamentablemente, el teclado se restablece cuando se llama a reloadInputViews en textField, que lo cambia a la configuración predeterminada de textField, por ejemplo, al pasar de la entrada de número a la entrada de correo electrónico. Puede minimizar la frecuencia con la que esto sucede solo llamando a reloadInputViews IF si cambia el tipo de clave de retorno.

int currentTextFieldReturnKeyType = textField.returnKeyType; 
[textField setReturnKeyType:UIReturnKeyGo]; 
if (currentTextFieldReturnKeyType != textField.returnKeyType) { 
    [textField reloadInputViews]; 
} 

Esto no resuelve completamente el problema, pero lo minimiza a la única pulsación de tecla en la que cambia la tecla de retorno.

0

Como todos dicen, reloadInputViews restablece el teclado a su inicial UIKeyboardType. Apple debería darnos una API para pedirle al teclado su tipo de teclado para volver a configurar lo que era antes de volver a cargar las vistas de entrada.

Con la nueva API de iOS8 puede crear su propio teclado devolviendo el UIKeyboardType.

Si aún está usando iOS7, puede solicitar una cierta vista de teclado para niños en qué estado se encuentra. Almacene ese valor y restablezca cada vez que lo necesite. Eche un vistazo a mi fuente aquí: https://github.com/ustwo/US2KeyboardType

Cuestiones relacionadas