2009-06-08 79 views
29

我有一個包含多個文本框的UIView。現在我已經使用委託將響應者從文本字段更改爲另一個字段。在這種情況下,當用戶進入上一個文本字段時,我的鍵盤會消失。當用戶觸摸uiview時隱藏鍵盤

但現在我想隱藏我的鍵盤,當用戶觸摸UIView(觸摸屏幕上的任何地方除了文本框)。有人可以幫我弄這個嗎。

感謝

回答

43

使用resignFirstResponder中的touchesBegan,像這樣:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch * touch = [touches anyObject]; 
    if(touch.phase == UITouchPhaseBegan) { 
     [self.myTextField resignFirstResponder]; 
    } 
} 

您可能需要,如果你不知道在哪裏焦點當前位於調用此對多個文本字段;我沒有測試過這種情況。

此外,在界面生成器,你將需要啓用該視圖的「已啓用用戶交互」複選框,或編程使用:

myView.userInteractionEnabled = YES; 
+0

但是,在調用此resignFirstResponder 。如何知道用戶觸摸了UIView? – nbojja 2009-06-08 06:09:31

+1

我已編輯帖子,在touchesBegan中包含一個示例。 – PCheese 2009-06-08 06:37:01

+0

嘿..感謝您的幫助..它與UIView很好地合作。但我有另一個場景,我在UITableView中有文本框。在這種情況下,你的代碼不工作。我對iPhone開發非常陌生,所以請...... – nbojja 2009-06-08 07:13:30

3

Beginning iPhone Development,你畫一個圓矩形按鈕,這樣它涵蓋了你的整個UI;完整的屏幕。然後轉到佈局菜單並單擊發送到後面。然後在檢查員中,將按鈕的類型從round rect更改爲自定義。現在,向這個按鈕添加一個觸摸內部事件並將其附加到處理它的方法。在這個方法的身體,請確保您有語句:

[myTextFieldOne resignFirstResponder]; 
[myTextFieldTwo resignFirstResponder]; 

基本上發送resignFirstResponder消息發送到每個文本字段,或能產生一個鍵盤的任何領域。

我其實是iPhone SDK的新手。我不知道這是否是最好的方法,但它是有效的,這是我從上述書中學到的。希望能幫助到你。

2

感謝Blaenk,我正在努力解決如何做到這一點,並沒有意識到我可以把一個按鈕放在後臺,很好的把戲!這裏是我的貢獻(新來這個網站,並可可觸及,因此它可能不是最強大的代碼以往,但它的工作迄今...):

我打電話從touchUpInside事件這個方法對我的UIButton:

-(void)closeKeyboard:(id)sender { 
    UIView *theFirstResponder = [self findFirstResponder]; 
    if (theFirstResponder) { 
     [theFirstResponder resignFirstResponder]; 
    } 
} 

當該環路發現firstResponder:

- (UIView *)findFirstResponder { 
    UIView *firstResponderView = nil; 
    for (UIView *view in [self entryFields]) { 
     if ([view isFirstResponder]) { 
      firstResponderView = view; 
      break; 
     } 
    } 
    return firstResponderView; 
} 

它是取決於每個在具有分配給他們的(再次標籤視圖的UITextField控件,可以做THA在Interface Builder中)。

無論如何,我的兩分錢,儘管我最好還給回來!

14

我用

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    if(touch.phase==UITouchPhaseBegan){ 
     //find first response view 
     for (UIView *view in [self.view subviews]) { 
      if ([view isFirstResponder]) { 
       [view resignFirstResponder]; 
       break; 
      } 
     } 
    } 
} 
2

SO我苦苦思索這一點,我想通了..

你不需要其他按鈕或任何東西。

所有你需要做的就是選擇「文件所有者」,在檢查器中從其textField出口(或任何你命名它)拖到你的實際文本框(通過你命名的任何東西)這將是除了任何輸入你已經連線了。

和ofcourse除了控制出口通過backgroundtouched ...的第一件事,我們都試圖

1

改變類的UIView類UIControl從的識別標籤(的UIView通過檢查改爲UIControl),以文件的所有者督察。 補充一點:

- (IBAction)tabBackground:(id) sender; 

您.h文件中。

添加到您的.m文件:

- (IBAction)tabBackgroup:(id) sender { 
    [nameField resignFirstRespnder]; 
    [numberField resignFirstResponder]; 
} 

您tabBackground從檢查連接,操作中收到部分UIView的(這是一個UIControl),你是好去。

25

只需在視圖控制器中調用此選項即可隱藏鍵盤。

[self.view endEditing:NO];

3

一個超級簡單的方法做,這是什麼工作PCheese說。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
UITouch * touch = [touches anyObject]; 
if(touch.phase == UITouchPhaseBegan) { 
    [self.view endEditing:YES]; 
} 

}

我以前用過[self.view endEditing:YES];一個按鈕事件,但與以前的答案結合它的工作原理治療。更容易,你不必做任何事情 - 只要把它放在你的.m文件中。此外,這適用於所有(至少,據我所見)文本字段(適用於UITextField和UITextView)。

我知道OP可能不會仍然需要這個,但我只是想分享給他人與同樣的問題。

1

解決這個問題是使用下面的方法的最適當的方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    if(![touch.view isMemberOfClass:[UITextField class]]) { 
     [touch.view endEditing:YES]; 
    } 
} 

注:這不會對UIScrollView的情況下工作。

0

爲SWIFT 4.0

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first 
    if touch?.phase == UITouchPhase.began { 
     touch?.view?.endEditing(true) 
    } 
}