iphone - apple - ipad
¿Mantiene visible la barra de herramientas alineada con el teclado del iPhone a través del cambio de primer respondedor? (2)
Debes crear un BOOL ivar para saber si el teclado ya está visible o no, así que harás un buen uso de todos los métodos de delegado UITextField :) Las barras de herramientas con múltiples campos de texto pueden ser complicadas, pero eres muy ¡cerca!
Estoy usando el método descrito por Josh en esta pregunta para agregar una barra de herramientas a la parte superior del teclado del iPhone. Básicamente, la idea es:
- Agregue el controlador de vista como un observador para las notificaciones
UIKeyboardWillShowNotification
yUIKeyboardWillHideNotification
en su método de inicialización - Cuando se publiquen esas notificaciones, anima una barra de herramientas dentro / fuera de la pantalla junto con el teclado
También tengo múltiples UITextFields en la pantalla, todos los cuales se convierten en el primer respondedor cuando se seleccionan para editar y renunciar al primer respondedor cuando se completa la edición (el usuario toca otro campo de texto, desactiva cualquier campo de texto o presiona "Listo" en el teclado - Tengo textFieldShouldReturn:
anulado para resignFirstResponder
).
Sin embargo, tengo un problema, ya que las notificaciones se publican cada vez que cambio de campos de texto. Por ejemplo, si un usuario está editando el campo de texto A, luego termina con él y toca el campo de texto B, A renuncia al primer respondedor y B se convierte en el primer respondedor. Sin embargo, esto también publica las notificaciones "se mostrará" y "se ocultará" en mi controlador de vista.
El resultado final de todo esto es que mientras la barra de herramientas aparece con el teclado para el primer campo de texto, y desaparece con el teclado para el último campo de texto, parece deslizarse dentro y fuera del teclado cada vez que el usuario cambia entre texto campos.
¿Hay alguna manera de responder solo a las notificaciones de "will {show, hide}" si el teclado realmente se va a mostrar u ocultar? Dicho de otra manera, ¿cómo puedo ignorar las notificaciones que no darán lugar a un cambio en el estado visible del teclado?
Para dar seguimiento a la respuesta de Reed: terminé usando la siguiente implementación. Utiliza un BOOL
para rastrear si el controlador se encuentra entre un texto textFieldShouldBeginEditing:
y textFieldDidBeginEditing:
message, así como un ivar para rastrear el campo de edición de texto actual.
La implementación asume que la interfaz tiene lo siguiente, con propiedades apropiadas y marcadores @synthesize
. MyKeyboardToolbar es una subclase de UIToolbar con un inicializador personalizado para crear sus propios botones.
BOOL shouldBeginEditing;
UITextField *editingField;
MyKeyboardToolbar *keyboardBar;
Y el código en sí:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
// Give up first responder so the keyboard goes away
[textField resignFirstResponder];
return YES;
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
self.shouldBeginEditing = YES;
return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField {
self.shouldBeginEditing = NO;
self.editingField = textField;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
// Do things here with the edited data (e.g. save it somewhere)
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
self.editingField = nil;
}
// These methods are added as the observers to the notification center
- (void)keyboardWillShow:(NSNotification *)notification {
if(self.keyboardBar == nil) {
// Create and show the keyboard toolbar
}
}
- (void)keyboardWillHide:(NSNotification *)notification {
if(![self shouldBeginEditing]) {
// Animate the bar off the screen, if necessary
// Remove and dispense of the bar entirely
[self.keyboardBar removeFromSuperview];
self.keyboardBar = nil;
}
}
// This method''s selector is given to the keyboard toolbar''s Done button
- (void)didPressKeyboardBarDoneButton {
[self.editingField resignFirstResponder];
}