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

面對現實,超越自己
逆水行舟,不進則退
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>
            亚洲影视综合| 亚洲私人影院在线观看| 久久亚洲综合色| 久久精品1区| 久久本道综合色狠狠五月| 久久精品网址| 欧美高清视频免费观看| 欧美精品videossex性护士| 欧美精品系列| 国产精品私拍pans大尺度在线| 欧美午夜片欧美片在线观看| 国产日韩欧美高清| 亚洲第一区色| 亚洲一区二区黄色| 久久久蜜桃一区二区人| 欧美国产日本高清在线| 亚洲最新视频在线播放| 久久高清国产| 欧美日韩mp4| 国内精品久久久久久久果冻传媒| 亚洲美女少妇无套啪啪呻吟| 欧美影院精品一区| 亚洲欧洲视频| 亚洲综合色自拍一区| 久久久久久久综合日本| 欧美超级免费视 在线| aⅴ色国产欧美| 久久久天天操| 国产精品视频大全| 99综合在线| 蜜臀91精品一区二区三区| 亚洲一区黄色| 欧美日韩国产一级| 亚洲国产成人一区| 久久久久久97三级| 一区二区三区四区精品| 欧美激情精品久久久久久久变态| 国产亚洲欧洲| 午夜国产精品视频免费体验区| 欧美风情在线观看| 香蕉久久a毛片| 国产精品久久久一本精品| 亚洲欧洲三级| 麻豆av一区二区三区久久| 亚洲一区二区三区在线视频| 欧美日韩一卡| 一本久道久久久| 亚洲国产美女| 女女同性精品视频| 亚洲高清在线观看| 美女日韩在线中文字幕| 久久成人免费视频| 国产一区欧美日韩| 香蕉国产精品偷在线观看不卡 | 日韩午夜在线播放| 欧美成人免费网站| 久久婷婷久久| 亚洲电影免费观看高清| 老司机精品视频一区二区三区| 亚洲自拍偷拍视频| 国产精品丝袜91| 欧美一区二区三区视频免费| 亚洲小视频在线观看| 国产精品网站在线| 欧美一进一出视频| 性欧美videos另类喷潮| 国语自产精品视频在线看8查询8| 久久手机免费观看| 久久在精品线影院精品国产| 亚洲福利视频网站| 91久久国产综合久久蜜月精品| 欧美激情一区二区三区在线| 夜夜嗨av一区二区三区| 亚洲天堂免费观看| 国语自产精品视频在线看8查询8| 免费看的黄色欧美网站| 欧美不卡高清| 午夜精品区一区二区三| 欧美在线视频观看免费网站| 影音先锋久久久| 亚洲国产一区视频| 欧美亚州韩日在线看免费版国语版| 午夜精品国产精品大乳美女| 欧美一级午夜免费电影| 欧美成人dvd在线视频| 亚洲精品国精品久久99热| 亚洲最快最全在线视频| 国产伪娘ts一区| 亚洲高清激情| 国产精品乱码一区二三区小蝌蚪 | 国产伦理一区| 欧美成人午夜激情视频| 欧美视频在线观看 亚洲欧| 久久精品欧美| 欧美激情第9页| 久久精品国产在热久久| 欧美激情四色| 久久久久久亚洲精品不卡4k岛国| 欧美激情一区| 久久精品成人一区二区三区蜜臀 | 欧美一区二区三区日韩| 亚洲精品国产精品久久清纯直播 | 欧美午夜美女看片| 欧美1区2区视频| 国产精品v日韩精品| 男人的天堂亚洲| 国产欧美韩国高清| 亚洲激情国产精品| 一区二区在线看| 亚洲与欧洲av电影| 一区二区三区四区五区精品| 久久久国际精品| 午夜亚洲福利在线老司机| 欧美激情综合五月色丁香小说| 久久久久久久久久久久久久一区| 欧美三级视频在线播放| 欧美成人免费播放| 韩国一区二区在线观看| 亚洲小视频在线观看| 一区二区欧美国产| 美女主播视频一区| 欧美成人免费小视频| 国产午夜精品麻豆| 亚洲自拍偷拍福利| 亚洲欧美日韩在线| 欧美日韩中文字幕| 日韩视频免费观看高清完整版| 亚洲国语精品自产拍在线观看| 久久不射中文字幕| 久久久久久一区二区三区| 国产精品视频导航| 亚洲免费视频网站| 性色av一区二区三区在线观看 | 黄色一区二区三区四区| 欧美一二三区在线观看| 久久精品一二三区| 国产一区二区三区在线观看精品 | 久久色中文字幕| 理论片一区二区在线| 狠狠综合久久av一区二区小说| 欧美一区二区日韩| 久久免费少妇高潮久久精品99| 国产午夜精品久久久久久免费视| 亚洲一区久久| 久久久精品国产免大香伊| 今天的高清视频免费播放成人| 欧美中文字幕视频在线观看| 久久久青草婷婷精品综合日韩 | 亚洲精品日韩一| 欧美人成在线视频| 一本色道88久久加勒比精品| 亚洲在线一区二区三区| 国产精品久久久久三级| 亚洲欧美日韩人成在线播放| 久久精品国产免费看久久精品| 国产一区香蕉久久| 久久亚洲国产精品一区二区| 亚洲激情六月丁香| 亚洲影视九九影院在线观看| 国产嫩草一区二区三区在线观看 | 亚洲自拍偷拍福利| 久久蜜桃资源一区二区老牛 | 欧美在线高清视频| 狠狠久久五月精品中文字幕| 美女性感视频久久久| 99成人在线| 久久久另类综合| 亚洲乱码国产乱码精品精天堂 | 欧美日韩一二三区| 午夜精品久久久久久久久久久久久 | 欧美一级淫片aaaaaaa视频| 韩国在线一区| 欧美日韩和欧美的一区二区| 亚洲欧美亚洲| 欧美激情亚洲国产| 性色av一区二区三区在线观看| 亚洲电影免费在线| 国产精品一区=区| 欧美福利在线观看| 欧美一区二区黄| 亚洲日本无吗高清不卡| 久久精品一二三| 亚洲永久免费| 亚洲精品之草原avav久久| 国产欧美日韩一区二区三区| 91久久久久| 久久亚洲欧洲| 亚洲无限av看| 亚洲三级电影在线观看| 国语精品中文字幕| 国产精品久久久久久久久久妞妞| 久久亚洲色图| 欧美亚洲一区三区| 一区二区不卡在线视频 午夜欧美不卡在 | 日韩一区二区精品在线观看| 麻豆成人在线播放| 欧美在线观看视频一区二区三区| 日韩午夜激情| 亚洲精品孕妇| 亚洲精美视频|