13

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

我拥有的是一个 UIViewController,它在其导航堆栈上推送一个编辑视图。编辑视图中有一堆 UITextFields。如果在触摸后退按钮时其中一个正在编辑,则在调用或的 UITextField 委托方法或 IB 链接操作方法之前调用原始视图的textFieldShouldEndEditingViewWillAppeartextFieldDidEndEditing方法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 <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;
}

日志结束于:

[...] 主视图将出现进入视图
[...] 编辑对象
[...] 在 vi​​ewWillDisappear
[...] -- 我们不在控制器堆栈中... 后退按钮已被按下
[ ...] ...] 主视图将出现进入视图
[...] 在 textFieldShouldEndEditing
[...] 在 textFieldEditingEnded
[...] 在 textFieldDidEndEditing

我想在为 UIViewControllerself.editedObject.name = nameField.text设置标签之前进行设置。viewWillAppear

我考虑在 EditViewController 的 viewWillDisappear 方法中检查我的任何文本字段当前是否是第一响应者,如果是,则获取他们的文本并存储它,但这似乎是一个麻烦,如果我维护起来会很痛苦添加或更改文本字段。

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

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

4

3 回答 3

17

好的,经过大量的网上冲浪、论坛阅读和手动阅读,我想出了一个简单的解决方案。正如我所怀疑的那样,它非常简单,只添加了一行代码。在viewWillDisappearEditViewContorller 的方法中,我简单地添加了:

    [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];
}

处理键盘上的“返回”的方法也处理导航控制器上的“返回”按钮。

感谢 Aaron 和 Jeff 的帮助并帮助我思考这个问题。

于 2010-11-01T05:16:01.757 回答
0

为什么不在其操作方法中使用该逻辑创建您自己的后退按钮?

于 2010-10-31T04:35:19.013 回答
-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;
}
于 2010-10-31T04:59:14.683 回答