一个界面,有多个UITextField的时候,点击提交按钮发送数据时,取消键盘
我们都知道,UITextField取消键盘用resignFirstResponder,
当一个界面有多个UITextField时,对每个UITextField变量用resignFirstResponder太麻烦了,
可以用转载的下面这篇文章的方法:
转载自:http://my.oschina.net/hmj/blog/100020
UIView之endEditing方法
原 发表于10个月前(2013-01-05 10:34) 阅读(439) | 评论(0) 2人收藏此文章, 我要收藏
赞0
问题
在
《IOS 键盘的显示和关闭》
一篇介绍了键盘的显示与关闭的原理流程性的东西,在关闭如果当前我们正在在textField上输入文本的话,我们只要做如下操作
1 | [textField resignFirstResponder] |
即可将键盘关闭,但随之问题也就出现了,假如考虑我们现在在应用中包含一了表单模块,要求填完表单之后我们要将数据进行保存,该表单可能包含了十几个UITextField对应的数据
输入项。此外包含了一个“提交”按钮,点击提交数据发送后台的过程中,我们要弹出一个简单的提交等待弹出框告知用户等待。整个流程并不复杂,但是涉及到了一个UI显示细节问题,即:
在用户等待的过程中键盘可能一直处于显示状态,虽然可能被弹出框的遮罩遮住,也许可能有些人不介意,但个人感觉正确正确的显示状态是,在点击提交数据后,紧接着是马上关闭键盘,
然后显示等待弹出框。因此,这涉及到要跟踪当前处于First Responder状态的UITextField对象,好让我们在提交的action中调用其resignFirstResponder方法关闭键盘,这
是我们可能直观上首先想到的问题的解决办法,的确,这也是最直观的。通常在IOS的MVC设计中,一个模块往往会对应一个UIViewController,假设我们的表单提交对应的Controller名为
FormViewController,我们可以用如下代码来简单解释以上处理流程:
01 | #import "FormViewController.h" |
03 | @interface FormViewController ()<UITextFieldDelegate> |
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; |
15 | @property (weak , nonatomic) UITextField *editingTextField ; |
18 | @implementation FormViewController |
19 | @synthesize textFieldA,textFieldB,textFieldC, |
20 | textFieldD,textFieldE,textFieldF,textFieldG,textFieldH, |
21 | textFieldI,editingTextField; |
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 ; |
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]; |
50 | - ( void )textFieldDidBeginEditing:(UITextField *)textField |
52 | self.editingTextField = textField ; |
55 | - (IBAction)submitForm:(UIBarButtonItem *)sender |
57 | [self.editingTextField resignFirstResponder]; |
这里FormViewController首先实现了UITextFieldDelegate协议,在viewDidLoad的时候,让所有textField的delegate都指向FormViewController,并且添加了editingTextField属性用于保存当前处于编辑状态下的textField对象,具体的跟踪方法是在在textFieldDidBeginEditing:代理方法中实现,这样在submitForm时,我们边可以调用
1 | [self.editingTextField resignFirstResponder]; |