我相信这是苹果文档中或必须已在这个论坛上的某个地方回答,因为它似乎很基本的,但我找不到它也不是一个特别优雅的解决方案自己。

什么我已经是一个UIViewController是推动其导航堆栈上的编辑视图。编辑观点有一堆在它UITextFields的。如果它们中的一个正被当返回按钮被触摸编辑,原始视图的viewWillAppear中方法要么textFieldShouldEndEditingtextFieldDidEndEditing或IB的的UITextField委托方法之前调用链接动作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;
}

日志与结束:

  

[...]进入视图将出现主视图,点击   [...]编辑对象点击   [...]在viewWillDisappear结果   [...] - 我们不是在控制器堆叠......后面已经按下按钮点击   [...]进入视图将出现主视图点击   [...]在textFieldShouldEndEditing结果   [...]在textFieldEditingEnded结果   [...]在textFieldDidEndEditing

我想设置self.editedObject.name = nameField.text之前的标签,viewWillAppear的UIViewController中获取设置。

我想过在viewWillDisappear方法为EditViewController检查,看是否有我的文本字段是目前第一个响应,如果因此让自己的文字和存储,但是这似乎是这样的杂牌组装电脑,这将是一个痛苦的如果添加或更改文本字段维护。

我也可以实现IB联行动每次击键后设置在编辑的对象的文本textFieldEditingChanged但这也是非常可观的开销,因为我必须找出哪些文本字段,我在每一个按键(只记得我表明name但也有一大堆他们的)。

所有我需要的是编辑要结束或知道viewWillAppear中是所谓的UIViewController中之前使nameFieldLabel设置正确的编辑将被终止。

有帮助吗?

解决方案

OK,我想通了很多网上冲浪,阅读论坛和手动阅读经过简单的解决方案。那是,我怀疑,补充非常简单,只有一个行代码。在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];
}

和代替处理“返回”在键盘上还处理导航控制器上的“返回”按钮已经方法。

感谢您亚伦和杰夫的协助和帮助我认为这通过。

其他提示

为什么不直接在其行动方法逻辑创建自己的后退按钮?

我认为从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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top