我确信这在苹果文档中或者一定在这个论坛的某个地方得到了回答,因为它看起来很基本,但我自己找不到它也不是一个特别优雅的解决方案。
我拥有的是一个 UIViewController,它将编辑 View 推送到其导航堆栈上。编辑 View 中有一堆 UITextFields。如果在触摸后退按钮时正在编辑其中一个 View ,则在 textFieldShouldEndEditing
或 textFieldDidEndEditing
的 UITextField 委托(delegate)方法或链接的 IB 之前调用原始 View 的 ViewWillAppear 方法调用操作 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;
}
日志结尾为:
[...] Entering view will appear for master view
[...] Editing the object
[...] In viewWillDisappear
[...] -- We are not in controller stack... the back button has been pushed
[...] Entering view will appear for master view
[...] In textFieldShouldEndEditing
[...] In textFieldEditingEnded
[...] In textFieldDidEndEditing
我想在 UIViewController 的 viewWillAppear
中设置标签之前设置 self.editedObject.name = nameField.text
。
我考虑过在 EditViewController 的 viewWillDisappear 方法中检查我的任何文本字段当前是否是第一响应者,如果是的话,获取它们的文本并存储它,但这似乎是一个很麻烦的事情如果我添加或更改文本字段,则进行维护。
我还可以实现textFieldEditingChanged
IB链接操作来在每次击键后设置编辑对象中的文本,但这也是相当大的开销,因为我必须弄清楚我是哪个文本字段在每次击键中(记住我只显示了名称
,但有一大堆)。
我所需要的只是结束编辑,或者知道在 UIViewController 中调用 viewWillAppear 之前结束编辑,以便正确设置 nameFieldLabel。
最佳答案
好吧,经过大量的网上冲浪、论坛阅读和手册阅读后,我找到了一个简单的解决方案。正如我所怀疑的,它非常简单,只添加了一行代码。在 EditViewContorller 的 viewWillDisappear 方法中,我简单地添加了:
[self.view.window endEditing: YES];
现在,textFieldShouldEndEditing
、textFieldEditingEnded
和 textFieldDidEndEditing
都在主视图的 viewWillAppear
执行之前被触发.
现在 viewWillDisappear
方法看起来像:
- (void) viewWillDisappear: (BOOL) animated {
[super viewWillDisappear: animated];
NSLog( @"In viewWillDisappear" );
// Force any text fields that might be being edited to end so the text is stored
[self.view.window endEditing: YES];
}
用于处理键盘上“返回”的方法也可以处理导航 Controller 上的“返回”按钮。
感谢 Aaron 和 Jeff 的帮助并帮助我思考这个问题。
关于iphone - 在 View 弹出之前存储 UITextField 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4061788/