Estoy seguro de que esto está en la documentación de Apple o debe haber sido respondido en algún lugar de este foro, ya que parece muy básico, pero no pude encontrarlo ni tampoco una solución particularmente elegante.Almacenamiento de contenido de UITextField antes de ver pops
Lo que tengo es un UIViewController que empuja una vista de edición en su pila de navegación. La vista de edición tiene un montón de UITextFields en ella. Si uno de ellos se está editando cuando se toca el botón Atrás, se llama al método ViewWillAppear de la vista original antes de que se invoquen los métodos delegados UITextField textFieldShouldEndEditing
o textFieldDidEndEditing
o el método de acción enlazado IB textFieldEditingEnded
.
Aquí hay un código que espero que sea más claro:
En el UIViewController:
- (void) viewWillAppear: (BOOL) animated {
[super viewWillAppear: animated];
NSLog(@"Entering view will appear for master view");
nameLabelField.text = objectToEdit.name;
}
- (IBAction) editMyObject: (id) sender {
NSLog(@"Editing the object");
EditViewController *evc = [[EditViewController alloc] initWithNibName: @"EditTableView" bundle: nil];
evc.editedObject = objectToEdit;
[self.navigationController pushViewController: evc animated: YES];
[evc release];
}
En el EditViewController < UITextFieldDelegate>:
- (void) viewWillAppear: (BOOL) animated {
[super viewWillAppear: animated];
nameField.text = editedObject.name;
}
- (void) viewWillDisappear: (BOOL) animated {
[super viewWillDisappear: animated];
NSLog(@"In viewWillDisappear");
if([self.navigationController.viewControllers indexOfObject: self] == NSNotFound) {
NSLog(@"-- We are not in controller stack... the back button has been pushed");
}
}
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {
NSLog(@"In textFieldShouldEndEditing");
// Store text field value here???
// editedObject.name = nameField.text;
return YES;
}
- (void) textFieldDidEndEditing: (UITextField *) textField {
NSLog(@"In textFieldDidEndEditing");
// Store text field value here???
// editedObject.name = nameField.text;
}
- (IBAction) textFieldEditingEnded: (id) sender {
NSLog(@"In textFieldEditingEnded");
// Store text field value here???
// editedObject.name = nameField.text;
}
El registro termina con :
[...] Entrando vista aparecerá de vista maestra
[...] Edición del objeto
[...] En viewWillDisappear
[...] - No estamos en pila controlador .. . el botón de retroceso ha sido empujado
[...] Entrando vista aparecerá de vista maestra
[...] En textFieldShouldEndEditing
[...] En textFieldEditingEnded
[...] En textFieldDidEndEditing
Quiero establecer self.editedObject.name = nameField.text
antes de que la etiqueta se establezca en viewWillAppear
para el UIViewController.
Pensé en el método viewWillDisappear para la comprobación de EditViewController para ver si alguno de mis campos de texto es actualmente el primero en responder y, si es así, obtener su texto y almacenarlo, pero esto parece un error que será un dolor para mantener si agrego o cambio campos de texto.
También puedo implementar la acción vinculada textFieldEditingChanged
IB para establecer el texto en el objeto editado después de cada pulsación de tecla, pero esto también es un poco elevado ya que tengo que descubrir qué campo de texto estoy en cada pulsación (recuerde solo mostró name
pero hay un montón de ellos).
Todo lo que necesito es que termine la edición o que la edición finalice antes de que se llame a viewWillAppear en el UIViewController para que el nombreFieldLabel esté configurado correctamente.
Gracias por su respuesta. También encontré que es la respuesta a esta pregunta: http://stackoverflow.com/questions/11319144/ios-xcode-crashed-after-typing-in-texts-in-uitextfield-and-go-back-nsisobject/ 11364617 # 11364617 – zekel
¡Muchas gracias! Esto me estaba volviendo loco. Intuitivamente, me gustaría ver esto como el comportamiento predeterminado. – guptron
Esto no funciona para mí, la transición ocurre antes de 'viewWillDisappear': ( – RnMss