endEditing

来源:互联网 发布:中国网络零售规模 编辑:程序博客网 时间:2024/05/18 09:05

问题

在 《IOS 键盘的显示和关闭》 一篇介绍了键盘的显示与关闭的原理流程性的东西,在关闭如果当前我们正在在textField上输入文本的话,我们只要做如下操作 

1[textField resignFirstResponder]

即可将键盘关闭,但随之问题也就出现了,假如考虑我们现在在应用中包含一了表单模块,要求填完表单之后我们要将数据进行保存,该表单可能包含了十几个UITextField对应的数据 输入项。此外包含了一个“提交”按钮,点击提交数据发送后台的过程中,我们要弹出一个简单的提交等待弹出框告知用户等待。整个流程并不复杂,但是涉及到了一个UI显示细节问题,即: 在用户等待的过程中键盘可能一直处于显示状态,虽然可能被弹出框的遮罩遮住,也许可能有些人不介意,但个人感觉正确正确的显示状态是,在点击提交数据后,紧接着是马上关闭键盘, 然后显示等待弹出框。因此,这涉及到要跟踪当前处于First Responder状态的UITextField对象,好让我们在提交的action中调用其resignFirstResponder方法关闭键盘,这 是我们可能直观上首先想到的问题的解决办法,的确,这也是最直观的。通常在IOS的MVC设计中,一个模块往往会对应一个UIViewController,假设我们的表单提交对应的Controller名为 FormViewController,我们可以用如下代码来简单解释以上处理流程: 

01#import "FormViewController.h"
02 
03@interface FormViewController ()<UITextFieldDelegate>
04 
05@property (weak, nonatomic) IBOutlet UITextField *textFieldA;
06@property (weak, nonatomic) IBOutlet UITextField *textFieldB;
07@property (weak, nonatomic) IBOutlet UITextField *textFieldC;
08@property (weak, nonatomic) IBOutlet UITextField *textFieldD;
09@property (weak, nonatomic) IBOutlet UITextField *textFieldE;
10@property (weak, nonatomic) IBOutlet UITextField *textFieldF;
11@property (weak, nonatomic) IBOutlet UITextField *textFieldG;
12@property (weak, nonatomic) IBOutlet UITextField *textFieldH;
13@property (weak, nonatomic) IBOutlet UITextField *textFieldI;
14 
15@property (weak , nonatomic) UITextField *editingTextField ; // 跟踪当前处于编辑状态的textfield
16 
17@end
18@implementation FormViewController
19@synthesize textFieldA,textFieldB,textFieldC,
20            textFieldD,textFieldE,textFieldF,textFieldG,textFieldH,
21            textFieldI,editingTextField;
22- (void)viewDidLoad
23{
24    [super viewDidLoad];
25    self.textFieldA.delegate = self ;
26    self.textFieldB.delegate = self ;
27    self.textFieldC.delegate = self ;
28    self.textFieldD.delegate = self ;
29    self.textFieldE.delegate = self ;
30    self.textFieldF.delegate = self ;
31    self.textFieldG.delegate = self ;
32    self.textFieldH.delegate = self ;
33    self.textFieldI.delegate = self ;
34     
35}
36- (void)viewDidUnload {
37    [self setTextFieldA:nil];
38    [self setTextFieldB:nil];
39    [self setTextFieldC:nil];
40    [self setTextFieldD:nil];
41    [self setTextFieldE:nil];
42    [self setTextFieldF:nil];
43    [self setTextFieldG:nil];
44    [self setTextFieldH:nil];
45    [self setTextFieldI:nil];
46    [self setEditingTextField:nil];
47    [super viewDidUnload];
48}
49// UITextFieldDelegate 方法
50- (void)textFieldDidBeginEditing:(UITextField *)textField
51{
52    self.editingTextField = textField ;
53}
54// 提交Action
55- (IBAction)submitForm:(UIBarButtonItem *)sender
56{
57    [self.editingTextField resignFirstResponder];
58    // 提交表单,弹出提示等待框,略
59}

这里FormViewController首先实现了UITextFieldDelegate协议,在viewDidLoad的时候,让所有textField的delegate都指向FormViewController,并且添加了editingTextField属性用于保存当前处于编辑状态下的textField对象,具体的跟踪方法是在在textFieldDidBeginEditing:代理方法中实现,这样在submitForm时,我们边可以调用 

1[self.editingTextField resignFirstResponder];

来关闭键盘。

流程上逻辑很简单,但总感觉只为实现关闭键盘这个功能,需要添加

1self.textFieldA.delegate = self ;
2self.textFieldB.delegate = self ;
3self.textFieldC.delegate = self ;
4self.textFieldD.delegate = self ;
5self.textFieldE.delegate = self ;
6self.textFieldF.delegate = self ;
7self.textFieldG.delegate = self ;
8self.textFieldH.delegate = self ;
9self.textFieldI.delegate = self ;

这一坨的重复代码,总感觉不爽。而且如果表单中出现多个UITextView的话,岂不是还要重复以上逻辑? 


endEditing:

说了半天终于开始讲到重点了,下面介绍下endEditing:方法,该方法为UIView中的一个方法,定义为 
1- (BOOL)endEditing:(BOOL)force
官网文档释义: 
Causes the view (or one of its embedded text fields) to resign the first responder status.
This method looks at the current view and its subview hierarchy for the text field that is currently the first responder. If it finds one, it asks that text field to resign as first responder. If the force parameter is set to YES, the text field is never even asked; it is forced to resign.

大意为: 
注销当前view(或它下属嵌入的text fields)的first responder 状态。
该方法会在当前view以及其subview层次结构中需找当前处于first responder状态的text field。如果找到的话会注销其first responder状态,如果指定force参数为YES,则不再询问text field,而直接强制注销其first responder状态。

好了,有了这个快捷方法,在FormViewController中,则不需要在实现UITextFieldDelegate,来对处于编辑状态的textField进行跟踪,也不必担心将来会添加N个UITextView,只要是在FormViewController下,我们 
只要调用  
1[self.view endEditing:YES];
键盘立马关闭! 

0 0