Я уверен, что это в документации Apple или, должно быть, где-то был дан ответ на этом форуме, так как это кажется таким простым, но я не смог найти ни одно, ни особенно элегантное решение сам.
У меня есть UIViewController, который помещает представление редактирования в свой стек навигации.В представлении редактирования есть куча полей UITextFields.Если один из них редактируется при нажатии кнопки «Назад», метод ViewWillAppear исходного представления вызывается перед вызовом методов делегата UITextField textFieldShouldEndEditing
или textFieldDidEndEditing
или метода связанного действия IB textFieldEditingEnded
.
Вот код, который, я надеюсь, сделает его более понятным:
В 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];
}
В EditViewController :
- (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;
}
Журнал заканчивается:
[...] Появится начальное представление для основного вида
[...] Редактирование объекта
[...] В viewWillDisappear
[...] - мы не в стеке контроллера ... нажата кнопка "Назад"
[...] Появится начальное представление для основного вида
[...] В textFieldShouldEndEditing
[...] В textFieldEditingEnded
[...] В textFieldDidEndEditing
Я хочу установить self.editedObject.name = nameField.text
до того, как метка будет установлена в viewWillAppear
для UIViewController.
Я думал о методе viewWillDisappear для проверки EditViewController, чтобы увидеть, является ли какое-либо из моих текстовых полей текущим первым респондентом, и если да, то получить их текст и сохранить его, но это похоже на такой клочок, который будетболь, чтобы поддерживать, если я добавляю или изменяю текстовые поля.
Я также могу реализовать связанное действие textFieldEditingChanged
IB, чтобы задавать текст в редактируемом объекте после каждого нажатия клавиши, но это также немного накладные расходы, так как я должен выяснить, какое текстовое поле я в каждомнажатие клавиши (помните, что я только показал name
, но их целая куча).
Все, что мне нужно, это чтобы редактирование было завершено или знать, что редактирование будет завершено до вызова viewWillAppear в UIViewControllerпоэтому nameFieldLabel правильно установлен.