青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

面對現實,超越自己
逆水行舟,不進則退
posts - 269,comments - 32,trackbacks - 0

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

 

(原文鏈接: http://mikixiyou.iteye.com/blog/1753330 )


第一種方法,使用它的委托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。

第四種方法,通過輕擊鍵盤之外的空白區域關閉虛擬鍵盤。
將屏幕上的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];  
            }  
        }  
    }  
}

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

 

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

- (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;  

我將視圖控制器的主視圖所屬類修改為這個新建視圖類。這樣在屏幕上輕擊任何位置都會關閉虛擬鍵盤。
這個方法是最簡單,也是最好的關閉虛擬鍵盤的方法。
使用好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.

posted on 2014-06-23 13:54 王海光 閱讀(354) 評論(0)  編輯 收藏 引用 所屬分類: IOS
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美午夜欧美| 欧美成人中文| 影音先锋亚洲电影| 国产一区二区av| 国产亚洲欧美色| 国内成人在线| 激情久久久久久久久久久久久久久久 | 91久久午夜| 亚洲美女区一区| 亚洲一二三四区| 久久成人国产| 欧美国产精品久久| 99国产精品久久久久久久久久| 一本色道久久| 久久国产精品99精品国产| 日韩视频永久免费| 亚洲欧洲精品一区| 欧美www在线| 亚洲精品免费在线| 亚洲一区免费视频| 久久精品视频在线| 欧美猛交免费看| 国产一区二区在线免费观看| 亚洲国产高清高潮精品美女| 亚洲系列中文字幕| 美女国产一区| 亚洲综合精品| 欧美激情一区二区三级高清视频| 国产精品99免费看 | 欧美成人综合网站| 国产精品美女主播在线观看纯欲| 一区二区视频在线观看| 亚洲一区二区三区777| 另类国产ts人妖高潮视频| 日韩视频久久| 欧美成人网在线| 韩国欧美国产1区| 亚洲性感美女99在线| 欧美成人一区二区| 午夜一区二区三区在线观看| 欧美日韩麻豆| 亚洲国产毛片完整版 | 性欧美18~19sex高清播放| 欧美sm极限捆绑bd| 欧美一级夜夜爽| 国产精品第一页第二页第三页| 亚洲国产三级| 久久久夜夜夜| 亚洲欧美中文另类| 国产精品久久久久久久久久妞妞 | 宅男精品导航| 欧美黄污视频| 久久性天堂网| 亚洲成色www8888| 久久在线视频| 久久久久国色av免费观看性色| 国产美女精品人人做人人爽| 亚洲欧美久久久| 在线视频中文亚洲| 国产精品扒开腿爽爽爽视频| 亚洲视频欧美视频| 一区二区三区www| 亚洲国产成人在线| 欧美激情亚洲精品| 老司机一区二区| 亚洲大片免费看| 农夫在线精品视频免费观看| 久久久99国产精品免费| 激情久久中文字幕| 欧美激情综合| 欧美激情中文字幕乱码免费| 亚洲国产精品悠悠久久琪琪| 亚洲国产va精品久久久不卡综合| 欧美激情偷拍| 亚洲一区二区毛片| 亚洲欧美成人| 黄色成人在线| 亚洲国产精品久久久久婷婷884| 欧美激情久久久久久| 亚洲小视频在线观看| 亚洲一区制服诱惑| 精品成人在线| 亚洲精品乱码久久久久久黑人| 欧美日韩一区二区国产| 亚洲欧美在线免费| 久久久九九九九| 日韩视频不卡中文| 午夜精品亚洲一区二区三区嫩草| 一区在线视频| 亚洲毛片在线观看| 国产视频欧美视频| 亚洲国产精品va在看黑人| 欧美日韩在线第一页| 久久久欧美精品sm网站| 欧美日韩不卡合集视频| 久久精品免费观看| 欧美国产日本| 欧美一级在线视频| 久久综合狠狠综合久久综合88| 亚洲精品在线二区| 先锋a资源在线看亚洲| 亚洲国产日韩欧美一区二区三区| 夜夜爽99久久国产综合精品女不卡| 国产女优一区| 亚洲片区在线| 国产亚洲精品自拍| 日韩一级片网址| 亚洲第一页自拍| 亚洲综合国产| 亚洲一级二级| 欧美风情在线| 免费观看亚洲视频大全| 国产欧美日韩在线观看| 99ri日韩精品视频| 亚洲欧洲精品天堂一级| 午夜精品福利一区二区蜜股av| 亚洲欧洲精品一区| 久久久久国产一区二区| 亚洲欧美在线高清| 欧美日韩在线高清| 亚洲精品色婷婷福利天堂| 伊人久久大香线蕉综合热线| 亚洲中无吗在线| 亚洲综合三区| 欧美色图天堂网| 亚洲精品视频啊美女在线直播| 尤妮丝一区二区裸体视频| 极品少妇一区二区三区精品视频| 亚洲精品中文字幕在线| 亚洲大胆女人| 久久精品亚洲一区二区| 久久大逼视频| 国产欧美日本一区视频| 亚洲一级片在线观看| 亚洲伊人观看| 欧美日韩三级视频| 亚洲日本无吗高清不卡| 亚洲精品美女在线观看播放| 久久久综合激的五月天| 久久久爽爽爽美女图片| 国产日韩一区二区三区在线播放 | 日韩一级成人av| 日韩午夜剧场| 欧美日韩一区二区在线观看| 亚洲精品乱码久久久久久日本蜜臀| 91久久久久| 欧美福利视频一区| 亚洲精品久久久蜜桃| 一本高清dvd不卡在线观看| 欧美久久精品午夜青青大伊人| 亚洲欧洲视频| 亚洲免费在线观看| 国产区在线观看成人精品| 性欧美大战久久久久久久久| 久久久精品国产免大香伊| 国产综合婷婷| 欧美成年人视频网站欧美| 亚洲精品一区二区三区婷婷月| 中文国产一区| 国产一区二区精品久久99| 久久这里只有精品视频首页| 亚洲大胆视频| 亚洲一区免费在线观看| 国产婷婷色综合av蜜臀av| 久久成人精品电影| 亚洲国产欧美一区二区三区丁香婷| 日韩午夜剧场| 国产一区二区三区视频在线观看| 久久先锋影音| 一本色道久久综合亚洲91| 欧美在线不卡| 亚洲日本欧美在线| 国产精品日韩二区| 麻豆精品视频在线| 99re66热这里只有精品3直播| 欧美一区不卡| 亚洲蜜桃精久久久久久久| 国产麻豆精品theporn| 久久久国产精彩视频美女艺术照福利| 亚洲缚视频在线观看| 欧美永久精品| 一本一道久久综合狠狠老精东影业 | 午夜一区二区三区不卡视频| 亚洲国产美女久久久久| 欧美在线视频一区二区三区| 曰韩精品一区二区| 国产精品a级| 麻豆精品视频| 欧美中文字幕| 亚洲午夜91| 亚洲高清123| 麻豆精品在线视频| 免费观看欧美在线视频的网站| 影音先锋成人资源站| 欧美日韩在线另类| 久久综合五月| 欧美在线观看天堂一区二区三区| 亚洲精品中文字幕在线观看| 麻豆av一区二区三区| 久久久久一区二区|