亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS關閉虛擬鍵盤方法匯總

2020-07-26 03:23:17
字體:
來源:轉載
供稿:網友

在iOS應用開發中,有三類視圖對象會打開虛擬鍵盤,進行輸入操作,但如何關閉虛擬鍵盤,卻沒有提供自動化的方法。這個需要我們自己去實現。這三類視圖對象分別是UITextField,UITextView和UISearchBar。 這里介紹一下UITextField中關閉虛擬鍵盤的幾種方法。

第一種方法,使用它的委托UITextFieldDelegate中的方法textFieldShouldReturn:來關閉虛擬鍵盤。

在UITextField視圖對象如birdNameInput所在的類中實現這個方法。

(BOOL)textFieldShouldReturn:(UITextField *)textField { if ((textField == self.birdNameInput) || (textField == self.locationInput)) { [textField resignFirstResponder]; } return YES; } - (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]; } - (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];UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];[self.view addGestureRecognizer:tap];[tap release];

再定義一下選擇器調用的方法dismissKeyboard。

(void)dismissKeyboard { [birdNameInput resignFirstResponder]; } -(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]; } } } } -(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。

第四種方法,通過輕擊鍵盤之外的空白區域關閉虛擬鍵盤。

將屏幕上的view也就是textField的父視圖拖一個touch down事件出來,和一個能關閉虛擬鍵盤的方法連接。如果視圖沒有touch down事件,可將view的父類從UIView修改為UIButton。 首先定義并實現一個方法backgroundTap:。

(IBAction) backgroundTap:(id)sender { NSArray *subviews = [self.view subviews]; for (id objInput in subviews) { if ([objInput isKindOfClass:[UITextField class]]) { UITextField *theTextField = objInput; if ([objInput isFirstResponder]) { [theTextField resignFirstResponder]; } } } } - (IBAction) backgroundTap:(id)sender{NSArray *subviews = [self.view subviews];for (id objInput in subviews) {if ([objInput isKindOfClass:[UITextField class]]) {UITextField *theTextField = objInput;if ([objInput isFirstResponder]) {[theTextField resignFirstResponder];}}}}

然后選擇背景視圖的Touch Down事件,連接 backgroundTap:即可。這樣只要輕擊一下虛擬鍵盤之外的區域,就能關閉虛擬鍵盤。這些方法都是使用resignFirstResponder方法來關閉虛擬鍵盤,還有其他的方法。

第五種方法,使用endEditing:方法 在所在的視圖控制器類中,覆蓋這個方法。

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [[self view] endEditing:YES]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {[[self view] endEditing:YES];}

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.

但是,如果這個屏幕很復雜,虛擬鍵盤之外的區域中有很多按鈕。輕擊這些區域時可能會輕擊到這些按鈕,這樣虛擬鍵盤就不能關閉。

要是找到一個沒有按鈕的空白區域都不容易且還有隱藏的視圖對象時,通過輕擊虛擬鍵盤之外的區域關閉虛擬鍵盤的方法實現起來就難了。

第六種方法,覆蓋hitTest:withEvent:方法關閉虛擬鍵盤

在stackoverflow.com上,有人這樣總結。說使用hitTest:withEvent:方法是最好的,也是最容易的解決方法。

I think the easiest (and best) way to do this is to subclass your global view and use hitTest:withEvent method to listen to any touch. Touches on keyboard aren't registered, so hitTest:withEvent is only called when you touch/scroll/swipe/pinch... somewhere else, then call [self endEditing:YES]. This is better than using touchesBegan because touchesBegan are not called if you click on a button on top of the view. It is better than UITapGestureRecognizer which can't recognize a scrolling gesture for example. It is also better than using a dim screen because in a complexe and dynamic user interface, you can't put dim screen every where. Moreover, it doesn't block other actions, you don't need to tap twice to select a button outside (like in the case of a UIPopover). Also, it's better than calling [textField resignFirstResponder], because you may have many text fields on screen, so this works for all of them.

因此,我再建立一個繼承UIView的視圖類。在這個視圖類中,覆蓋hitTest:withEvent:方法,增加[self endEditing:YES]方法。

(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *result = [super hitTest:point withEvent:event]; [self endEditing:YES] return result; } - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {UIView *result = [super hitTest:point withEvent:event];[self endEditing:YES]return result;}

我將視圖控制器的主視圖所屬類修改為這個新建視圖類。這樣在屏幕上輕擊任何位置都會關閉虛擬鍵盤。 這個方法是最簡單,也是最好的關閉虛擬鍵盤的方法。 使用好hitTest:withEvent:這個方法,還可以實現很多很復雜的功能。

The implementation of hitTest:withEvent: in UIResponder does the following:

• It calls pointInside:withEvent: of self
• If the return is NO, hitTest:withEvent: returns nil. the end of the story.
• If the return is YES, it sends hitTest:withEvent: messages to its subviews. it starts from the top-level subview, and continues to other views until a subview returns a non-nil object, or all subviews receive the message.
• If a subview returns a non-nil object in the first time, the first hitTest:withEvent: returns that object. the end of the story.
• If no subview returns a non-nil object, the first hitTest:withEvent: returns self
This process repeats recursively, so normally the leaf view of the view hierarchy is returned eventually. However, you might override hitTest:withEvent to do something differently. In many cases, overriding pointInside:withEvent: is simpler and still provides enough options to tweak event handling in your application.

以上給大家介紹了六種iOS關閉虛擬鍵盤的方法,大家可以根據個人需要選擇一種適合自己比較好的方法。同時也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品xxxx| 在线视频一区二区| 亚洲国产精品一区二区久| 亚洲精品国产美女| 亚洲人av在线影院| 亚洲男人天堂2023| 色偷偷偷亚洲综合网另类| 久久成人精品电影| 国产精品揄拍一区二区| 亚洲精品乱码久久久久久按摩观| 日日狠狠久久偷偷四色综合免费| 美女av一区二区三区| 国产精品视频一| 97精品久久久中文字幕免费| 欧美日韩在线免费| 国产精品96久久久久久又黄又硬| 久久99精品国产99久久6尤物| 国产91精品久久久| 国产色婷婷国产综合在线理论片a| 久久亚洲一区二区三区四区五区高| 精品成人乱色一区二区| 亚洲自拍偷拍区| 日韩精品在线观看一区| 国产欧美日韩91| 欧美在线欧美在线| 欧美自拍大量在线观看| 午夜精品久久久久久久男人的天堂| 精品国产成人在线| 91免费的视频在线播放| 91老司机精品视频| 揄拍成人国产精品视频| 亚洲成人精品视频| 久久久精品久久久| 亚洲国产中文字幕久久网| 一区二区三区亚洲| 国产99久久精品一区二区 夜夜躁日日躁| 日韩欧美国产高清91| 欧美xxxx18国产| 粉嫩老牛aⅴ一区二区三区| 日本欧美国产在线| 高跟丝袜一区二区三区| 成人伊人精品色xxxx视频| 久久手机免费视频| 欧美黑人又粗大| 欧美性生交xxxxxdddd| 欧美成人中文字幕| 亚洲国产黄色片| 狠狠久久五月精品中文字幕| 精品国产乱码久久久久久虫虫漫画| 亚洲人精选亚洲人成在线| 欧美性精品220| 欧美精品亚州精品| 国产精品久久一区| 欧美专区在线视频| 国产精品第七十二页| 欧美激情一二三| 国产精品偷伦视频免费观看国产| 欧美亚洲免费电影| 日韩精品极品在线观看| 国产精品91免费在线| 亚洲男人av在线| 中文字幕无线精品亚洲乱码一区| 国内免费精品永久在线视频| 激情亚洲一区二区三区四区| 中文字幕亚洲综合久久| 国产一区在线播放| 91久久久在线| 91精品国产色综合久久不卡98| 亚洲一区久久久| 97欧美精品一区二区三区| 欧美午夜美女看片| 最好看的2019年中文视频| 狠狠躁夜夜躁人人爽超碰91| 日韩在线观看免费网站| 日韩电影大片中文字幕| 91精品国产电影| 亚洲美女福利视频网站| 国产精品永久免费视频| 国产精品一区二区三区毛片淫片| 欧美日韩激情小视频| 亚洲精品一区二区网址| 久久久久久亚洲精品不卡| 亚洲性生活视频在线观看| 国产成人精品免高潮费视频| 在线观看欧美日韩国产| 亚洲第一区中文99精品| 日韩在线观看av| 九九热精品在线| 国产成人av在线| 日韩欧美在线网址| 欧美日韩加勒比精品一区| 97成人精品区在线播放| 国产成人午夜视频网址| 正在播放国产一区| 亚洲va欧美va国产综合久久| 亚洲欧美制服综合另类| 亚洲高清在线观看| 午夜精品久久久久久久久久久久| 欧美在线免费观看| 午夜精品在线观看| 在线观看欧美www| 亚洲成人黄色网址| 国产一区二区三区视频在线观看| 欧美激情性做爰免费视频| 亚洲午夜精品视频| 欧美激情女人20p| 美女999久久久精品视频| 精品国产一区二区三区久久久狼| 日本午夜在线亚洲.国产| 欧美在线免费看| 日韩一区二区三区xxxx| 成人精品视频在线| 日韩hd视频在线观看| 91亚洲精品一区| 亚洲视频999| 国产日韩视频在线观看| 麻豆成人在线看| 国产精品www色诱视频| 日韩在线观看你懂的| 亚洲欧美日韩精品| 视频在线观看一区二区| 欧美日韩中文在线观看| 欧美激情2020午夜免费观看| 欧美色视频日本高清在线观看| 欧美成人中文字幕| 亚洲护士老师的毛茸茸最新章节| 欧美一级大片视频| 国产精品青青在线观看爽香蕉| 91精品国产综合久久香蕉922| 欧美一级片久久久久久久| 国产精品私拍pans大尺度在线| 精品亚洲一区二区三区在线播放| 中文字幕国产精品| 欧美理论电影在线播放| 亚洲另类图片色| 欧美精品在线观看| 久久99精品久久久久久噜噜| 精品偷拍各种wc美女嘘嘘| 98午夜经典影视| 91精品国产自产在线观看永久| 日韩精品在线观| 成人免费大片黄在线播放| 久久久久久久久久久久av| 在线视频免费一区二区| 中文精品99久久国产香蕉| 亚洲免费人成在线视频观看| 欧美日韩国产123| 91久久久久久久久久| 欧美国产日本高清在线| 国产欧美在线播放| 亚洲天堂av在线免费| 北条麻妃99精品青青久久| 欧美精品videossex性护士| 亚洲免费电影在线观看| 日韩高清电影免费观看完整| 中文字幕日韩av综合精品| 欧美激情精品在线| 亚洲影院色在线观看免费| 日本欧美国产在线| 亚洲一区中文字幕| 欧美天堂在线观看| 色偷偷噜噜噜亚洲男人的天堂| 亚洲欧美日韩国产精品| 亚洲欧美激情另类校园|