Я уверен, что это в документации Apple или, должно быть, было где-то на этом сайте, так как он кажется таким базовым, но я не мог найти его или особенно элегантное решение.Хранение содержимого UITextField перед просмотром
У меня есть 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 < 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;
}
Журнал заканчивается :
[...] Ввод вида будет отображаться на главном зрение
[...] Редактирование объекта
[...] В viewWillDisappear
[...] - Мы не в стеке контроллера .. . кнопка назад была нажата
[...] Ввод вида будет отображаться на главном зрение
[...] В textFieldShouldEndEditing
[...] В textFieldEditingEnded
[...] В textFieldDidEndEditing
Я хочу установить self.editedObject.name = nameField.text
, прежде чем метка будет установлена в viewWillAppear
для UIViewController.
Я думал об этом в методе viewWillDisappear для проверки EditViewController, чтобы увидеть, является ли какое-либо из моих текстовых полей в настоящее время первым ответчиком, и если он получает их текст и сохраняет его, но это похоже на такой kludge, который будет больно для поддержки, если я добавляю или изменяю текстовые поля.
Я также могу реализовать действие, связанное IB IB , чтобы установить текст в отредактированном объекте после каждого нажатия клавиши, но это также довольно немного накладных расходов, так как я должен выяснить, какое текстовое поле я нахожу в каждом нажатии клавиши (помните, что я только показал name
, но есть целая куча).
Все, что мне нужно для завершения редактирования или для того, чтобы знать, что редактирование будет закончено до того, как в UIViewController вызывается viewWillAppear, поэтому правильно задано имяFieldLabel.
Спасибо за ваш ответ. Я нашел это также ответом на этот вопрос: http://stackoverflow.com/questions/11319144/ios-xcode-crashed-after-typing-in-texts-in-uitextfield-and-go-back-nsisobject/ 11364617 # 11364617 – zekel
Большое вам спасибо! Это сводило меня с ума. Интуитивно я хотел бы видеть это как поведение по умолчанию. – guptron
Это не работает для меня, segue происходит до 'viewWillDisappear': ( – RnMss