iphone - 在 View 弹出之前存储 UITextField 内容

标签 iphone uitextfield popviewcontroller

我确信这在苹果文档中或者一定在这个论坛的某个地方得到了回答,因为它看起来很基本,但我自己找不到它也不是一个特别优雅的解决方案。

我拥有的是一个 UIViewController,它将编辑 View 推送到其导航堆栈上。编辑 View 中有一堆 UITextFields。如果在触摸后退按钮时正在编辑其中一个 View ,则在 textFieldShouldEndEditingtextFieldDidEndEditing 的 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];

现在,textFieldShouldEndEditingtextFieldEditingEndedtextFieldDidEndEditing 都在主视图的 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/

相关文章:

ios - 如果出现警报,则无法设置 UITextField 的 selectedTextRange,首先

iphone - 如何在iphone sdk中接收语音邮件?

android - 如何解决 android 和 ios 跨平台开发的#define 问题?

ios - UITextField secureEntry 错误放置光标

iphone - 如何定位从 UITextField 派生的自定义 UIView 控件

iphone - popViewController 不会自动旋转回允许的方向

iphone - popViewController/viewWillAppear 在 iOS 5 中没有动画

iOS7 崩溃 - PopViewController 在 Landscape ViewController 上调用

ios - iOS 中通过 wifi 的点对点网络

iphone - 仪器中没有出现泄漏,即使我确信它们存在