2011-07-22 10 views
9

Tengo varios UITextFields en mi opinión (cada uno dentro de una UITableViewCell). Cuando se dispara el teclado desde cualquiera de los campos de texto, necesito hacer algunas animaciones, principalmente para cambiar el marco de UITableView. Lo mismo debe suceder cuando el teclado se ocultará.UIKeyboardWillShowNotification, UIKeyboardWillHideNotification y NSNotificationCenter problema entre las versiones de iOS

He hecho la animación, por lo que este no es el problema aquí.

Ahora, yo uso NSNotificationCenter para atrapar muestra/ocultación del teclado:

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

El problema es cuando el teclado es visible (se utiliza un campo de texto) y pulse dentro de otro campo de texto. Por lo general, para esto, el teclado no se ocultará, sino que permanecerá visible.

Funciona bien en iOS 4, pero el problema viene en 3.1.3 (esta es la versión que puedo probar, posiblemente cualquier versión por debajo de 3.2). En las versiones anteriores a la 3.2 cambiar el enfoque de un campo de texto directamente a otro campo de texto activará UIKeyboardWillHideNotification y UIKeyboardWillShowNotification.

Cualquiera sabe una manera de realizar algunas animaciones cuando el teclado realmente se mostrará/ocultará, sin NSNotificationCenter?

¿O cómo puedo solucionar este problema con versiones inferiores a 3.2?

Gracias.

+1

Una consideración: casi todo el mundo se ha actualizado a iOS 4 y aquellos que rara vez han descargado o actualizado aplicaciones. Una alternativa es cambiar a solo compatibilidad con iOS 4 para nuevas versiones. Solo preocúpese de apoyar tanto si su aplicación es algo a la par de importancia con una aplicación bancaria o si tiene alguna necesidad muy especial para hacerlo. –

+0

@Peter: de acuerdo con usted. Solo que la aplicación está casi lista. Este pequeño problema no es una razón real para que solo admita dispositivos iOS4. – CristiC

Respuesta

12

Lo que puede hacer es configurar el delegado del campo de texto/de Vista de Texto al controlador de vista actual y poner en práctica estos 2 métodos

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    _keyboardWillHide = NO; 
    return YES; 
} 

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView 
{ 
    _keyboardWillHide = NO; 
    return YES;  
} 

Después de que en el método que consiguen que está provocada por la notificación UIKeyboardWillHideNotification se puede hacer algo como

if (_keyboardWillHide) { 
    // No other textfield/textview was selected so you can animate the tableView 
    ... 
} 
_keyBoardWillHide = YES; 

Avísame si a usted eso le sirve.

+0

Gracias, lo intentaré esta noche y te responderé. – CristiC

+0

Funcionó, pero con pequeños cambios: en su respuesta _keyBoardWillHide = YES; estaba en UIKeyboardWillHideNotification. Lo moví a todas partes donde tenía [UITextField resignFirstResponder]; – CristiC

+0

Esos dos métodos son los mismos ... – shim

2

En lugar de evitar las notificaciones, puede establecer un NSTimer por 0.1 segundo para hacer sus animaciones en una, y en la otra, cancelar el temporizador, de esa manera si obtiene UIKeyboardWillHide y UIKeyboardWillShow a la vez, obtendrá una oportunidad de cancelar el temporizador. Si no obtiene ambos, el temporizador llegará a cero y las animaciones se llevarán a cabo.

+0

Esta es una buena idea. Pero no se puede hacer, ya que esto creará un pequeño espacio (retraso) entre la animación del UIKeyboard y mi propia animación. – CristiC

+0

¿Las notificaciones siempre se activan en un orden predecible? –

+0

Sí. Primero esconde y muestra. – CristiC

1

Considere utilizar el protocolo UITextFieldDelegate. El método textFieldShouldBeginEditing: se activará antes de la notificación y se disparará cada vez que entre en el campo de texto.

Cuestiones relacionadas