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

时间:2010-10-31 03:54:04

标签: iphone uitextfield popviewcontroller

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

我所拥有的是一个UIViewController,它在其导航堆栈上推送编辑视图。编辑视图中包含一堆UITextField。如果在触摸后退按钮时正在编辑其中一个,则在textFieldShouldEndEditingtextFieldDidEndEditing的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

我在viewWillDisappear方法中想到了EditViewController,检查我的文本字段是否是当前第一个响应者,如果是这样的话,获取文本并存储它,但这看起来像是一个痛苦的如果我添加或更改文本字段,请维护。

我还可以实现textFieldEditingChanged IB链接操作,在每次击键后设置编辑对象中的文本,但这也是相当多的开销,因为我必须找出每次击键时我在哪个文本字段(记住我只展示了name,但是有很多都是。)

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

3 个答案:

答案 0 :(得分:17)

好的,经过大量网上冲浪,论坛阅读和手动阅读后,我找到了一个简单的解决方案。我怀疑它非常简单,只添加了一行代码。在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];
}

现有的处理键盘上“返回”的方法也可以处理导航控制器上的“后退”按钮。

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

答案 1 :(得分:0)

为什么不在其action方法中创建自己的Back按钮?

答案 2 :(得分:-1)

我认为从UX的角度来看,您应该显示一个警告,以确定用户是否想要在退出当前视图之前取消他们所处的编辑操作。

通过提醒用户,您可以看到他们是否意外地点击了按钮,或者他们是否决定离开视图,采取适当的措施。

// add this to the field(s) to be edited, selector will be called as the changes
// are being made... still difficult to handle a cancel, but should work
[objectToEdit addTarget:self action:@selector(updateNameField:) 
                         forControlEvents:UIControlEventEditingChanged];

此处附加代码......

// the method called to update object from parent view
- (void)updateNameField:(id)sender {
    <OBJECT TO UPDATE>.text = ((UITextField *)sender).text;
}