我确定这是在Apple文档中,或者必须在本论坛的某个地方回答,因为它看起来很基本,但我自己找不到它,也没有特别优雅的解决方案。在视图弹出之前存储UITextField内容
我所拥有的是一个UIViewController,它在导航堆栈上推送编辑视图。编辑视图中有一堆UITextFields。如果在后退按钮被触摸时正在编辑其中一个,则在调用textFieldShouldEndEditing
或textFieldDidEndEditing
的UITextField代理方法或调用IB链接操作textFieldEditingEnded
方法之前调用原始视图的ViewWillAppear方法。
下面是一些代码,我希望会更清楚:
在的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
在为UIViewController设置标签viewWillAppear
之前。
我在EditViewController的viewWillDisappear方法中考虑过检查我的任何文本字段是否是当前的第一响应者,如果是这样,获取他们的文本并存储它,但这看起来像这样一个kludge,将是一个痛苦保持是否添加或更改文本字段。
我也可以实现textFieldEditingChanged
IB链接操作,以便在每次击键之后设置编辑对象中的文本,但这也是一个相当大的开销,因为我必须弄清楚每个击键中的哪个文本字段(请记住我只显示name
,但有一大堆)。
我所需要的只是编辑结束或知道编辑将在UIViewController中调用viewWillAppear之前结束,因此nameFieldLabel已正确设置。
感谢您的回答。我发现它也是这个问题的答案:http://stackoverflow.com/questions/11319144/ios-xcode-crashed-after-typing-in-texts-in-uitextfield-and-go-back-nsisobject/ 11364617#11364617 – zekel 2012-07-06 14:56:48
非常感谢你!这让我疯狂。直觉上,我希望将此视为默认行为。 – guptron 2013-07-18 17:19:01
这不适用于我,segue发生在'viewWillDisappear'之前::( – RnMss 2015-05-15 07:49:24