UIView之endEditing方法

问题

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

[textField resignFirstResponder]

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

#import "FormViewController.h"

@interface FormViewController ()<UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UITextField *textFieldA;
@property (weak, nonatomic) IBOutlet UITextField *textFieldB;
@property (weak, nonatomic) IBOutlet UITextField *textFieldC;
@property (weak, nonatomic) IBOutlet UITextField *textFieldD;
@property (weak, nonatomic) IBOutlet UITextField *textFieldE;
@property (weak, nonatomic) IBOutlet UITextField *textFieldF;
@property (weak, nonatomic) IBOutlet UITextField *textFieldG;
@property (weak, nonatomic) IBOutlet UITextField *textFieldH;
@property (weak, nonatomic) IBOutlet UITextField *textFieldI;

@property (weak , nonatomic) UITextField *editingTextField ; // 跟踪当前处于编辑状态的textfield

@end
@implementation FormViewController
@synthesize textFieldA,textFieldB,textFieldC, 
            textFieldD,textFieldE,textFieldF,textFieldG,textFieldH, 
            textFieldI,editingTextField; 
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.textFieldA.delegate = self ;
    self.textFieldB.delegate = self ;
    self.textFieldC.delegate = self ;
    self.textFieldD.delegate = self ;
    self.textFieldE.delegate = self ;
    self.textFieldF.delegate = self ;
    self.textFieldG.delegate = self ;
    self.textFieldH.delegate = self ;
    self.textFieldI.delegate = self ;
    
}
- (void)viewDidUnload {
    [self setTextFieldA:nil];
    [self setTextFieldB:nil];
    [self setTextFieldC:nil];
    [self setTextFieldD:nil];
    [self setTextFieldE:nil];
    [self setTextFieldF:nil];
    [self setTextFieldG:nil];
    [self setTextFieldH:nil];
    [self setTextFieldI:nil];
    [self setEditingTextField:nil];
    [super viewDidUnload];
}
// UITextFieldDelegate 方法
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    self.editingTextField = textField ;
}
// 提交Action
- (IBAction)submitForm:(UIBarButtonItem *)sender
{
    [self.editingTextField resignFirstResponder];
    // 提交表单,弹出提示等待框,略
}

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

[self.editingTextField resignFirstResponder];

来关闭键盘。

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

self.textFieldA.delegate = self ;
    self.textFieldB.delegate = self ;
    self.textFieldC.delegate = self ;
    self.textFieldD.delegate = self ;
    self.textFieldE.delegate = self ;
    self.textFieldF.delegate = self ;
    self.textFieldG.delegate = self ;
    self.textFieldH.delegate = self ;
    self.textFieldI.delegate = self ;

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


endEditing:

说了半天终于开始讲到重点了,下面介绍下endEditing:方法,该方法为UIView中的一个方法,定义为
- (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下,咱们
只要调用 
[self.view endEditing:YES];
键盘立马关闭!


注:描述于IOS5.1下 spa

相关文章
相关标签/搜索