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

相關文章
相關標籤/搜索