作者:zyl910
關於隱藏軟鍵盤,網上的辦法良莠不齊,大多是通過實現UITextFieldDelegate來隱藏軟鍵盤,該方法代碼較多,且在文字框很多的時不好處理。我經過搜尋與摸索,找到了最佳的處理辦法。
一、隱藏自身軟鍵盤
當對於有多個UITextField控制項都想通過點擊“Return”來隱藏自身軟鍵盤的情況,這時的最好辦法是使用Did End on Exit事件。在點擊軟鍵盤右下角的“Return”按鈕後,會觸發該事件。
該事件有一個sender參數表示當前文字框,這樣便可以編寫一個通用的事件處理方法(.m檔案)——
- (IBAction)TextField_DidEndOnExit:(id)sender { // 隱藏鍵盤. [sender resignFirstResponder];}
然後在.h檔案中填寫該方法的聲明——
- (IBAction)TextField_DidEndOnExit:(id)sender;
回到storyboard,並按command+option+enter開啟次要視窗,使次要視窗顯示.h檔案。
選中一個UITextField控制項,點擊滑鼠右鍵彈出面板,滑鼠左鍵按住Did End on Exit事件旁邊的圓圈,然後拖曳到右側.h檔案的TextField_DidEndOnExit方法上,便會建立好事件串連。
隨後按照同樣的做法,將其他UITextField控制項的Did End on Exit事件也串連到TextField_DidEndOnExit方法。
運行一下,可發現每個文字框的軟鍵盤都可以通過點擊“Return”來隱藏了。
二、點擊Return自動轉到下個文字框
當頁面中有很多個文字框時,如果每次都需要點文字框啟用軟鍵盤、輸入後點擊Return隱藏軟鍵盤、再點擊下一個文字框……這樣操作起來太繁瑣了。
於是我們希望能夠實現點擊Return時能夠自動轉到下一個文字框。尤其是對於最後一個文字框,希望能夠在點擊Return時執行下一步操作。
例如對於登入頁面。它上面有 帳號文字框(nameTextField)、密碼文字框(passTextField)、登入按鈕(loginButton)。
我們希望——點擊帳號文字框軟鍵盤的Return時跳轉到密碼文字框,點擊密碼文字框軟鍵盤的Return時執行登入。
因為這兩個文字框的功能不同,不能像上一節那樣寫一個TextField_DidEndOnExit做統一處理,而應該分別建立各自的事件處理方法。
回到storyboard,右擊帳號文字框(nameTextField)彈出面板,按住Did End on Exit事件旁邊的圓圈,然後拖曳到右側.h檔案的空白地方,此時會彈出一個對話方塊給方法命名。輸入名稱(nameTextField_DidEndOnExit)後斷行符號確定,便自動產生了該事件方法。
隨後按照同樣的做法,為密碼文字框(passTextField)的Did End on Exit事件串連方法(passTextField_DidEndOnExit)。
來到.m檔案,填寫具體代碼——
- (IBAction)nameTextField_DidEndOnExit:(id)sender { // 將焦點移至下一個文字框. [self.passTextField becomeFirstResponder];}- (IBAction)passTextField_DidEndOnExit:(id)sender { // 隱藏鍵盤. [sender resignFirstResponder]; // 觸發登陸按鈕的點擊事件. [self.loginButton sendActionsForControlEvents:UIControlEventTouchUpInside];}
對於帳號文字框轉密碼文字框,不需要隱藏軟鍵盤,只需要調用becomeFirstResponder啟用新的文字框就行了。
對於密碼文字框Return後執行登入。因為不再需要顯示軟鍵盤,所以還是得調用resignFirstResponder隱藏軟鍵盤,然後觸發登入按鈕(loginButton)的UIControlEventTouchUpInside事件進行登入。
運行一下,可發現已經達到我們希望的效果了。點擊帳號文字框軟鍵盤的Return時跳轉到密碼文字框,點擊密碼文字框軟鍵盤的Return時執行登入。
怎麼都是“Return”,轉換文字框與執行登入明明是不同的功能?
於是將帳號文字框的Return Key屬性設為“Next”,將密碼文字框的Return Key屬性設為“Done”,使介面與功能一致。
三、輕觸背景隱藏軟鍵盤
只能通過Return關閉軟鍵盤太不靈活了,應該提供輕觸背景隱藏軟鍵盤的功能。
在storyboard,點擊背景View,將它的Custom Class設定為UIControl,這樣才會出現Touch Down事件。
右擊背景View彈出面板,按住Touch Down事件旁邊的圓圈,然後拖曳到右側.h檔案的空白地方建立該事件的處理方法。
來到.m檔案,填寫具體代碼——
- (IBAction)View_TouchDown:(id)sender { // 發送resignFirstResponder. [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];}