在iOS應用中,輸入操作的方式之一是使用虛擬鍵盤。打開很容易,關閉卻有一些講究。這需要我們去研究一下。我所知道的需要打開虛擬鍵盤的三類視圖對象分別是UITextField,UITextView和UISearchBar。實現這個操作的方法大體是點擊虛擬鍵盤的return鍵或done鍵等關閉它,或者是點擊鍵盤之外的區域關閉它。最好的方法是點擊虛擬鍵盤之外的區域來關閉它的方法,采用的是覆蓋視圖控制器的hitTest:withEvent:方法實現。
我就UITextField如何關閉虛擬鍵盤舉個例子,介紹我所知道的幾種方法。
第一種方法,使用它的委托UITextFieldDelegate中的方法textFieldShouldReturn:來關閉虛擬鍵盤。
在UITextField視圖對象如birdNameInput所在的類中實現這個方法。
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ((textField == self.birdNameInput) || (textField == self.locationInput)) {
[textField resignFirstResponder];
}
return YES;
}
這樣,在輸入框birdNameInput中打開虛擬鍵盤後,輕擊鍵盤的return鍵就會自動關閉掉虛擬鍵盤。
第二種方法,將birdNameInput的屬性中Return Key修改為done,再定義一個方法和Done鍵的Did End On Exit連接。通過輕擊done鍵觸發這個事件來關閉虛擬鍵盤。
定義的方法如下:
- (IBAction) textFieldDoneEditing:(id)sender
{
[sender resignFirstResponder];
}
這兩個方法都是輕擊虛擬鍵盤上一個鍵來關閉它。這屬於精確操作,而手指不像鼠標,做這種操作不容易。因此就UI層面而言,這兩個方法都不是最好的方法。
在iphone或ipad屏幕上,虛擬鍵盤占用的面積大小是有限的。通過輕擊虛擬鍵盤之外的區域而關閉虛擬鍵盤。
第三種方法,通過輕擊鍵盤之外的空白區域關閉虛擬鍵盤。
在birdNameInput所屬的視圖控制器類的viewDidLoad方法中定義一個UITapGestureRecognizer的對象,然後將它賦值為它的視圖。
UITapGestureRecognizer *tap =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
[tap release];
再定義一下選擇器調用的方法dismissKeyboard。
-(void)dismissKeyboard {
[birdNameInput resignFirstResponder];
}
如果屏幕上有多個textField的話,一個一個地列出來就有些麻煩。那麼將方法修改一下,如下:
-(void)dismissKeyboard {
NSArray *subviews = [self.view subviews];
for (id objInput in subviews) {
if ([objInput isKindOfClass:[UITextField class]]) {
UITextField *theTextField = objInput;
if ([objInput isFirstResponder]) {
[theTextField resignFirstResponder];
}
}
}
}
如果這個屏幕上的視圖對象很復雜的話,另當別論。
這個方法是編碼新建一個手勢對象。也可以直接使用interface builder圖形化開發工具,在storyboard中拉入一個手勢對象到視圖控制器類中,再將此手勢對象建立一個IBACTION,名稱可以是dismissKeyboard。