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

面對現實,超越自己
逆水行舟,不進則退
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>
            欧美一级淫片aaaaaaa视频| 亚洲一区在线视频| 亚洲品质自拍| 一区二区三区高清视频在线观看| 亚洲综合视频一区| 亚洲在线观看| 久久免费精品视频| 欧美日韩三区| 国产一区二区精品久久91| 永久域名在线精品| 国语自产精品视频在线看抢先版结局| 亚洲欧洲精品一区二区三区| 久久精品国产2020观看福利| 亚洲精品乱码久久久久久黑人 | 激情欧美国产欧美| 亚洲一区二区三区高清| 欧美成人激情视频| 欧美在线一级va免费观看| 欧美性生交xxxxx久久久| av成人毛片| 久久日韩精品| 亚洲免费成人av电影| 欧美sm重口味系列视频在线观看| 国产有码在线一区二区视频| 亚洲女人天堂av| 99综合视频| 欧美日韩亚洲一区二区| 日韩一级黄色片| 亚洲缚视频在线观看| 卡一卡二国产精品| 精品69视频一区二区三区| 欧美伊久线香蕉线新在线| 亚洲永久免费观看| 国产三区精品| 久久国产日本精品| 久久gogo国模啪啪人体图| 黄色一区三区| 亚洲国产欧美一区二区三区同亚洲| 亚洲一区二区三区中文字幕在线 | 欧美aa在线视频| 久久久久国产精品www| 激情小说另类小说亚洲欧美 | 欧美制服第一页| 在线亚洲精品| 欧美一区二区三区免费视频| 国产香蕉久久精品综合网| 久久婷婷av| 奶水喷射视频一区| 亚洲少妇中出一区| 亚洲一区三区电影在线观看| 亚洲综合色自拍一区| 国产欧美一区二区三区国产幕精品| 欧美一区二区高清| 久久天天躁夜夜躁狠狠躁2022| 性欧美videos另类喷潮| 国产精品女同互慰在线看| 中国女人久久久| 亚洲综合国产激情另类一区| 国产欧美精品日韩精品| 久久久久久黄| 欧美另类99xxxxx| 午夜久久久久| 欧美激情综合色| 久久精品日产第一区二区| 欧美日韩免费| 免费成人毛片| 理论片一区二区在线| 欧美一区二区三区久久精品 | 亚洲成人直播| 中国日韩欧美久久久久久久久| 欧美日韩一区免费| 欧美国产1区2区| 国产日韩精品一区二区浪潮av | 免费久久99精品国产自| 午夜精品久久久久久久99樱桃| 欧美18av| 国产精品欧美风情| 欧美大片免费久久精品三p| 国产在线播精品第三| 亚洲美女色禁图| 99国产成+人+综合+亚洲欧美| 亚洲欧美在线x视频| 国产一区二区三区高清| 亚洲一区二区高清视频| 亚洲欧洲三级电影| 欧美伊人影院| 亚洲精品在线观看免费| 欧美在线观看一区| 亚洲欧美偷拍卡通变态| 欧美精品v日韩精品v韩国精品v| 欧美综合第一页| 欧美日韩在线综合| 亚洲国产日韩综合一区| 一区二区三区在线视频观看| 亚洲午夜精品| 亚洲一区二区三区影院| 欧美伦理91| 亚洲激情一区二区三区| 精品成人在线| 久久精品理论片| 久久精品国产77777蜜臀| 国产精品www.| 99这里只有精品| 99精品国产在热久久下载| 久久综合伊人77777尤物| 欧美在线综合视频| 国产麻豆91精品| 亚洲一区二区三区四区在线观看| 日韩视频在线你懂得| 久久裸体艺术| 久久夜色撩人精品| 狠狠色综合网站久久久久久久| 亚洲欧美日韩一区| 欧美一区久久| 国产农村妇女毛片精品久久麻豆| 亚洲视频日本| 午夜精品久久一牛影视| 国产精品一二| 欧美一区二区三区四区在线观看 | 欧美国产一区二区| 在线不卡免费欧美| 久久久久综合一区二区三区| 快播亚洲色图| 亚洲国产美国国产综合一区二区| 久久久人成影片一区二区三区| 欧美影院在线播放| 国产精品ⅴa在线观看h| 亚洲国产成人久久| 亚洲欧洲一级| 欧美精品福利| 99国内精品| 性欧美在线看片a免费观看| 欧美激情a∨在线视频播放| 亚洲国产精品ⅴa在线观看| 亚洲国产欧美日韩精品| 欧美激情精品久久久久久蜜臀| 久久精品成人欧美大片古装| 免费视频久久| 日韩一级欧洲| 亚洲特级片在线| 国产午夜精品一区二区三区视频| 久久成人一区二区| 亚洲国产精品福利| 亚洲人成在线影院| 欧美成人精品在线视频| 日韩视频一区二区三区在线播放免费观看 | 亚洲高清不卡| 欧美日韩综合另类| 久久精品国产亚洲一区二区| 亚洲人成欧美中文字幕| 亚洲欧美在线免费观看| 在线日韩中文| 国产精品视频观看| 欧美国产在线观看| 久久国产加勒比精品无码| 久久久久国产精品一区三寸| 国内免费精品永久在线视频| 欧美大片免费观看| 欧美一区二区三区四区在线观看地址 | 欧美一区二区在线免费播放| 亚洲国产精品女人久久久| 国产精品扒开腿爽爽爽视频 | 在线中文字幕不卡| 免费视频一区| 午夜精品一区二区三区在线| 在线观看欧美一区| 国产精品视频yy9299一区| 欧美成人中文字幕| 久久精品国产免费观看| 一本色道久久综合亚洲精品小说 | 欧美视频一区二区三区| 久久er99精品| 欧美一区不卡| 亚洲欧美日韩精品在线| 亚洲午夜极品| 亚洲综合第一页| 午夜日韩福利| 欧美一站二站| 久久精品人人爽| 久久九九精品| 久久久久久成人| 麻豆精品国产91久久久久久| 久久综合久久综合久久综合| 久久嫩草精品久久久精品| 卡一卡二国产精品| 欧美精品一区二区三区一线天视频 | 久久久久久久久久码影片| 久久国产精品一区二区三区| 久久国产精品久久久久久| 欧美一区二粉嫩精品国产一线天| 午夜在线观看免费一区| 久久久国产精彩视频美女艺术照福利 | 99re热精品| 亚洲免费视频网站| 欧美在线观看网站| 久久全国免费视频| 欧美激情一区二区三区全黄| 亚洲美女视频网| 欧美亚洲自偷自偷| 美日韩丰满少妇在线观看|