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

面對現實,超越自己
逆水行舟,不進則退
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>
            国产乱码精品一区二区三| 亚洲国产天堂久久综合网| 久久视频一区| 久久精品国产成人| 午夜精品一区二区在线观看 | 久久久久久久久久久久久久一区 | 国产欧美日韩精品一区| 欧美精品在线免费| 欧美区二区三区| 国产精品久久久久一区二区三区共 | 国产亚洲一区二区精品| 国产精品视频一二| 亚洲国产cao| 亚洲欧美国产一区二区三区| 午夜精品久久| 亚洲高清成人| 亚洲精品中文在线| 一区二区三区四区五区精品视频| 日韩一级片网址| 久久网站热最新地址| 国产一区二区剧情av在线| 亚洲国产精品久久久久秋霞不卡 | 免费高清在线视频一区·| 欧美国产欧美亚洲国产日韩mv天天看完整 | 夜夜嗨av一区二区三区免费区| 在线视频日韩| 亚洲第一视频网站| 久久久久久久网站| 韩国一区电影| 免费亚洲婷婷| 欧美一区不卡| 国产精品视频免费观看www| 一区二区三区日韩精品| 亚洲精品美女| 欧美激情黄色片| 亚洲欧洲综合另类在线| 欧美国产日本在线| 欧美精品一区二区三区四区| 亚洲片国产一区一级在线观看| 欧美一级免费视频| 亚洲免费成人av| 国产精品va在线| 欧美在线观看网址综合| 亚洲免费影视第一页| 欧美视频免费在线| 亚洲欧美日韩精品久久亚洲区| 亚洲国内在线| 欧美日韩在线一区| 国产精品欧美久久| 一本色道综合亚洲| 亚洲美女中文字幕| 久久九九热re6这里有精品| 91久久久一线二线三线品牌| 亚洲第一福利视频| 亚洲麻豆国产自偷在线| 亚洲视频在线观看一区| 亚洲欧美日韩国产一区二区| 欧美99久久| 亚洲国产三级| 亚洲人成在线观看一区二区| 亚洲欧美日韩在线播放| 正在播放欧美一区| 欧美不卡视频一区发布| 亚洲淫片在线视频| 欧美日韩亚洲国产精品| 亚洲国产婷婷| 亚洲国产国产亚洲一二三| 欧美怡红院视频| 亚洲天堂男人| 老司机精品福利视频| 欧美成人性生活| 久久久精品999| 国产精品免费观看视频| 9l国产精品久久久久麻豆| 91久久线看在观草草青青| 久久亚洲不卡| 亚洲国产va精品久久久不卡综合| 国产亚洲aⅴaaaaaa毛片| 校园激情久久| 亚洲成色最大综合在线| 亚洲精选成人| 国产精品福利在线观看| 亚洲视频网在线直播| 久久久免费精品| 欧美专区日韩视频| 免费毛片一区二区三区久久久| 亚洲午夜视频在线观看| 先锋影音久久久| 亚洲三级免费| 国产在线麻豆精品观看| 久久野战av| 中文一区在线| 欧美凹凸一区二区三区视频| 最新中文字幕亚洲| 国产伦精品一区二区三| 久久亚洲精品一区| 一区二区三区欧美日韩| 欧美电影电视剧在线观看| 亚洲综合视频网| 亚洲精品一二三| 亚洲国产精品成人一区二区| 欧美日韩亚洲另类| 欧美精品久久久久久久久老牛影院| 亚洲最黄网站| 亚洲激情午夜| 亚洲激情视频在线| 久久中文精品| 老**午夜毛片一区二区三区| 亚洲免费网址| 午夜精品亚洲| 久久av一区| 久久亚洲精品网站| 久久女同精品一区二区| 久久久久亚洲综合| 免费看亚洲片| 亚洲国语精品自产拍在线观看| 欧美成人精品不卡视频在线观看| 亚洲一区美女视频在线观看免费| 久久久久久久国产| 亚洲福利一区| 亚洲黄色免费网站| 亚洲美女诱惑| 欧美成年网站| 国产精品videosex极品| 亚洲精品乱码久久久久久黑人 | 最新日韩中文字幕| 久久亚洲不卡| 最新成人av在线| 亚洲免费在线看| 欧美成人黄色小视频| 欧美视频一区二区| 国产视频一区在线| 亚洲免费观看高清完整版在线观看熊| 99riav1国产精品视频| 亚洲美女尤物影院| 午夜一级久久| 亚洲美女免费精品视频在线观看| 亚洲伊人久久综合| 欧美日韩另类丝袜其他| 在线看不卡av| 亚洲欧美韩国| 亚洲图片你懂的| 国产精品对白刺激久久久| 黄色国产精品| 免费成人高清在线视频| 亚洲小说欧美另类社区| 欧美sm极限捆绑bd| 国精品一区二区| 亚洲性视频h| 亚洲日本一区二区三区| 午夜精品一区二区三区在线 | 99伊人成综合| 久久久久久久综合| 欧美激情视频一区二区三区不卡| 亚洲精品国久久99热| 久久夜色精品国产欧美乱极品| 欧美日韩另类丝袜其他| 国产三级精品三级| 欧美1区2区| 国产农村妇女精品一二区| 亚洲人精品午夜| 欧美日韩亚洲综合在线| 亚洲美女中出| 亚洲一区视频在线观看视频| 你懂的网址国产 欧美| 在线视频日韩| 久久精品国产99国产精品| 狠狠狠色丁香婷婷综合激情| 欧美激情视频网站| 国产欧美日韩综合| 欧美成人精品福利| 国产精品夫妻自拍| 欧美mv日韩mv国产网站app| 欧美日韩亚洲一区三区| 久久久欧美一区二区| 国产精品美女主播| 亚洲黄网站在线观看| 激情五月婷婷综合| 亚洲欧美日韩电影| 日韩视频精品在线| 久久精品亚洲一区| 久久精视频免费在线久久完整在线看| 欧美肥婆bbw| 亚洲第一精品在线| 亚洲国产精品久久久久秋霞蜜臀 | 国产综合久久久久久鬼色| 亚洲成色777777女色窝| 激情综合色丁香一区二区| 午夜老司机精品| 亚洲欧美99| 国产美女精品一区二区三区| 夜夜嗨网站十八久久| 亚洲图色在线| 国产精品日本| 亚洲欧美一级二级三级| 久久精品国产精品| 黄色资源网久久资源365| 午夜精品亚洲| 国产乱码精品一区二区三| 亚洲一品av免费观看|