在查看弹出窗口之前存储UITextField内容

Lav*_*der 13 iphone uitextfield popviewcontroller

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

我所拥有的是一个UIViewController,它在其导航堆栈上推送编辑视图.编辑视图中包含一堆UITextField.如果其中一人正在编辑时返回按钮被触摸时,原始视图的viewWillAppear中方法任一的UITextField委托方法之前调用textFieldShouldEndEditingtextFieldDidEndEditing,或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];
}
Run Code Online (Sandbox Code Playgroud)

在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;
}
Run Code Online (Sandbox Code Playgroud)

日志最终得到:

[...]主视图将显示输入视图
[...]编辑对象
[...]在viewWillDisappear
[...]中 - 我们不在控制器堆栈中...后退按钮已被按下
[ ...]进入视图将显示为主视图
[...]在textFieldShouldEndEditing
[...] in textFieldEditingEnded
[...] in textFieldDidEndEditing

我想self.editedObject.name = nameField.textviewWillAppear为UIViewController 设置标签之前设置.

我在viewWillDisappear方法中想到了EditViewController,检查我的文本字段是否是当前第一个响应者,如果是这样的话,他们的文本和存储它,但这似乎是一个很难维护,如果我添加或更改文本字段.

我还可以实现textFieldEditingChangedIB链接动作,以便在每次击键后在编辑对象中设置文本,但这也是相当多的开销,因为我必须找出每次按键时我在哪个文本字段(记住我只显示name但是有他们中的一大堆).

我需要的只是编辑结束或知道在UIViewController中调用viewWillAppear之前编辑将结束,因此正确设置了nameFieldLabel.

Lav*_*der 17

好的,经过大量的网上冲浪,论坛阅读和手动阅读,我找到了一个简单的解决方案.我怀疑它非常简单,只添加了一行代码.在viewWillDisappearEditViewContorller 的方法中,我简单地添加了:

    [self.view.window endEditing: YES];
Run Code Online (Sandbox Code Playgroud)

现在textFieldShouldEndEditing,textFieldEditingEndedtextFieldDidEndEditing所有获得前发射了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];
}
Run Code Online (Sandbox Code Playgroud)

并且处理键盘上的"返回"的方法也处理导航控制器上的"后退"按钮.

感谢Aaron和Jeff的帮助,并帮助我思考.