存储的UITextField鉴于之前弹出内容
-
27-09-2019 - |
题
我相信这是苹果文档中或必须已在这个论坛上的某个地方回答,因为它似乎很基本的,但我找不到它也不是一个特别优雅的解决方案自己。
什么我已经是一个UIViewController是推动其导航堆栈上的编辑视图。编辑观点有一堆在它UITextFields的。如果它们中的一个正被当返回按钮被触摸编辑,原始视图的viewWillAppear中方法要么textFieldShouldEndEditing
或textFieldDidEndEditing
或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];
现在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];
}
和代替处理“返回”在键盘上还处理导航控制器上的“返回”按钮已经方法。
感谢您亚伦和杰夫的协助和帮助我认为这通过。
其他提示
为什么不直接在其行动方法逻辑创建自己的后退按钮?
我认为从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;
}