2012-09-01 96 views
3

我試圖在觸摸屏幕上其他任何地方後隱藏鍵盤。我使用的代碼是基於this answer這裏。隱藏文本區域外的觸摸鍵盤

IBOutlet UITextView *myTextView; 

而且方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [[event allTouches] anyObject]; 
    if ([myTextView isFirstResponder] && [touch view] != myTextView) { 
     [myTextView resignFirstResponder]; 
    } 
    [super touchesBegan:touches withEvent:event]; 
} 

我不明白的是我應該怎麼我的UITextField鏈接到touchesBegan方法。我需要使用哪個發送的事件?此外,該方法不應該是一個IBAction,因爲現在我無法將我的UITextField連接到它。

我也給this code一個嘗試,但一個是打破我的導航按鈕(甚至在評論中提到的解決方案)

回答

7

我應該怎麼我的UITextField鏈接到的touchesBegan方法。我需要使用哪個發送的事件?此外,該方法不應該是一個IBAction,因爲現在我無法將我的UITextField連接到它。

因爲你沒有。您必須在文本字段是子視圖的視圖上重寫此方法。

+0

我不知道我是壓倒一切的方法。謝謝! – networkprofile

+0

@ H2CO3這將意味着我們將不得不繼承視圖...有沒有任何方法沒有子類化..? –

+0

我沒有繼承它,它工作正常。我正在實現'UIViewController'雖然.. – networkprofile

-2

嘗試快速和骯髒的方式:

以一個按鈕,並將其鏈接到一個動作方法(讓我們稱之爲IT背景)。拉伸按鈕以覆蓋整個視圖。調整視圖的圖層,以便只有用戶通過觸摸進行交互的內容纔是按鈕的頂部。將按鈕的類型更改爲自定義,這會使該按鈕不可見。在方法Background中關閉firstResponder。

+1

不必要的過度複雜和hackish。 OP的解決方案只有幫助和乾淨,這是它應該完成的方式。 -1。 – 2012-09-01 12:56:48

4

我所做的是將整體UIView類更改爲UIControl。 enter image description here

這給你一個touchDown事件,你可以鏈接到一個方法resignFirstResponder。 enter image description here
UIControl仍然爲您提供UIView的所有功能。

-(IBAction)backgroundTap:(id)sender 
{ 
    [text1 resignFirstResponder]; 
    [text2 resignFirstResponder]; 
    [textLogin resignFirstResponder]; 
    [textPassword resignFirstResponder]; 
} // Resign all responders 
+1

不必要。看到我的答案。 – 2012-09-01 13:18:23

+0

最好的一個,但我們如何才能做到這一點programitaclly? –

+0

而不是添加一個UIView到控制器,添加一個UIControl。 – Darren

27

目標C:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [[self view] endEditing:YES]; 
} 

斯威夫特:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    self.view.endEditing(true) 
} 

這是我發現的最好方式,這是非常簡單的。

+0

完美的作品! – Anunay

+0

+1不需要選擇器,因此適用於多個輸入。 – danwild

0
- (void)viewDidLoad 
{ 
    //for keybord hide when touch outside: 


    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
            initWithTarget:self 
            action:@selector(hidekeybord)]; 
    [self.view addGestureRecognizer:tap]; 



    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
} 


-(void)hidekeybord 
{ 

    [_yourtextfield.txt resignFirstResponder]; 

} 
0
In .h 
@property (nonatomic, assign) id currentResponder; 

In .h 
//in viewDidLoad: 

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resignOnTap:)]; 
    [singleTap setNumberOfTapsRequired:1]; 
    [singleTap setNumberOfTouchesRequired:1]; 
    [self.view addGestureRecognizer:singleTap]; 

//Implement the below delegate method: 

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    self.currentResponder = textField; 
} 

//Implement resignOnTap: 

- (void)resignOnTap:(id)iSender { 
    [self.currentResponder resignFirstResponder]; 
} 
相關問題