鍵盤的回收
當對於有多個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];
- }
四、自定義鍵盤
源碼可以到我的github中下載:https://github.com/colin1994/myKeyboard.git
可以通過自定義鍵盤, 在鍵盤上加入你需要的功能, 即可。
效果如下:
代碼如下:
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
- if (self.keyboardToolbar == nil)
- {
- self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 38.0f)];
- self.keyboardToolbar.barStyle = UIBarStyleBlackTranslucent;
- UIBarButtonItem *previousBarItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"前進", @"")
- style:UIBarButtonItemStyleBordered
- target:self
- action:@selector(previousField:)];
- UIBarButtonItem *nextBarItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"後退", @"")
- style:UIBarButtonItemStyleBordered
- target:self
- action:@selector(nextField:)];
- UIBarButtonItem *spaceBarItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
- target:nil
- action:nil];
- UIBarButtonItem *doneBarItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"隱藏", @"")
- style:UIBarButtonItemStyleDone
- target:self
- action:@selector(resignKeyboard:)];
- [self.keyboardToolbar setItems:[NSArray arrayWithObjects:previousBarItem, nextBarItem, spaceBarItem, doneBarItem, nil]];
- }
- self.myTextView.inputAccessoryView = self.keyboardToolbar;
- }
- #pragma mark - your code
- - (void)resignKeyboard:(id)sender
- {
- [self.myTextView resignFirstResponder];
- }
- - (void)previousField:(id)sender
- {
- }
最後更新:2017-04-03 05:39:19