2010-10-31 50 views
13

我确定这是在Apple文档中,或者必须在本论坛的某个地方回答,因为它看起来很基本,但我自己找不到它,也没有特别优雅的解决方案。在视图弹出之前存储UITextField内容

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

我在EditViewController的viewWillDisappear方法中考虑过检查我的任何文本字段是否是当前的第一响应者,如果是这样,获取他们的文本并存储它,但这看起来像这样一个kludge,将是一个痛苦保持是否添加或更改文本字段。

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

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

回答

17

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

并恰当处理键盘上的“返回”还处理导航控制器上的“返回”按钮已经是方法。

谢谢亚伦和杰夫的帮助,并帮助我思考。

+0

感谢您的回答。我发现它也是这个问题的答案:http://stackoverflow.com/questions/11319144/ios-xcode-crashed-after-typing-in-texts-in-uitextfield-and-go-back-nsisobject/ 11364617#11364617 – zekel 2012-07-06 14:56:48

+0

非常感谢你!这让我疯狂。直觉上,我希望将此视为默认行为。 – guptron 2013-07-18 17:19:01

+0

这不适用于我,segue发生在'viewWillDisappear'之前::( – RnMss 2015-05-15 07:49:24

0

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

+0

谢谢你的建议杰夫。这可能是我需要做的事情,但是我忽略了按钮本身出现的UI,除非我通过制作一个PNG文件等来制作自定义按钮,我做了很多工作。如果必须的话,我愿意这么做,为了获得这些功能,但我希望能够添加到我的代码中,但我缺少一些东西。 – LavaSlider 2010-10-31 04:43:48

-1

我认为,从用户体验的角度来看,您应该显示一条警报,以确定用户是否要在退出当前视图之前取消它们处于中间的编辑操作。

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

// 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; 
} 
+0

我会好的。我真的认为这将是一个有意的后退按钮...为什么必须击中完成然后返回?我想要求排除意外的“后退”。但是这并没有提供任何帮助,因为我不知道是否显示警报,因为我不知道是在编辑过程中的文本字段还是文本字段。 – LavaSlider 2010-10-31 05:06:25

+0

@LavaSlider看到编辑,做一些像textFieldEditingChanged你正在讨论 – 2010-10-31 08:45:38

+0

@LavaSlider不太难实现类似textFieldEditingChanged的东西。请参阅上面的解决方案编辑 – 2010-10-31 08:46:47

相关问题