2010-06-26 116 views
29

我有一個UITextField的視圖,它應該在按下返回時隱藏鍵盤。resignFirstResponder不隱藏textFieldShouldReturn上的鍵盤

我的功能是這樣的:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
if (textField == userPassword) { 
    [textField resignFirstResponder]; 
} 
return YES; 
} 

通常情況下,鍵盤應該被隱藏,但它停留在屏幕上。正確調用resignFirstResponder。我錯過了什麼?

+0

你試過沒有返回?返回YES可能會導致文本字段運行一些代碼,從而使其再次成爲第一響應者。 – rickharrison 2010-06-26 22:38:10

+0

是的,我做了,它沒有改變。但重點似乎從字段中刪除,右側的(X)清除字段內容不再顯示後resignFirstResponder – favo 2010-06-27 07:22:47

+0

我在iPad上遇到同樣的問題 – 2010-09-01 20:08:55

回答

49

我看到你有這個iPad標籤。你是否正在使用UIModalPresentationFormSheet呈現模態視圖?如果是這樣,看起來這是FormSheet模式演示文稿的限制(Apple出於某種原因故意使用它,或者它是一個錯誤)。看到這些其他問題的更多細節:

Modal Dialog Does Not Dismiss Keyboard

Modal View Controller with keyboard on landscape iPad changes location when dismissed

+0

多數民衆贊成正是發生了什麼事,謝謝你,我接受你的答案,因爲它解釋說這是一些蘋果的行爲/錯誤 – favo 2011-02-27 15:10:30

+1

哇,我花了一段時間才找到這個答案,它完美的工作。我不知道它與UIModalPresentationFormSheet有關。 – zachzurn 2012-05-03 07:03:52

+5

tony.stack的答案實際上解決了這個問題。 – 2012-08-16 15:37:32

10

如果您正在使用Interface Builder,請查看您的UITextField是否具有與您班級相關聯的授權。

- 選擇您的UITextField並在Connections中查看是否退出Outlets-> delegate中的一個連接。如果沒有,請與您的File's Owner Class聯繫。

這需要與您的文件所有者類關聯。這個代表告訴在哪裏搜索一個方法。如果您正在重寫某個方法,則需要告知該對象將在何處搜索該方法。

+0

響應者被正確調用,它不是委託的問題。謝謝你嘗試:-) – favo 2010-08-14 16:21:15

3

我遇到了同樣的問題。我意識到在將委託連接到Interface Builder中的文件所有者後,我忽略了保存在Interface Builder中。一旦我保存,我重新編譯和鍵盤在返回時消失。

0

根據你的評論,它看起來像焦點已經轉移,那麼我認爲可能發生的事情是,鍵盤保持打開下一個文本輸入字段。如果您的返回鍵是「下一步」鍵,則返回YES for textFieldShouldReturn:將使下一個textField成爲第一響應者,並保持鍵盤可見。

2

您是否記得實施UITextFieldDelegate協議?

+0

如果你實現了UITextFieldDelegate協議,你可以在無意中導致這種行爲,如果你做文本驗證。如果您的驗證代碼在文本無效時從textFieldShouldEndEditing返回false,則該字段不能放棄它的firstResponder狀態,並且鍵盤將保留在下一個視圖中的屏幕上。更多細節在http://stackoverflow.com/questions/8379205/uitextfields-keyboard-wont-dismiss-no-really/37082876#37082876 – 2016-05-06 23:44:02

4

爲了應對由布蘭登提到的問題,可以嘗試關閉並重新開啓模式視圖控制器,只要你仍然有參考它。

[textField resignFirstResponder]; 
[self dismissModalViewControllerAnimated:NO]; 
[self presentModalViewController:yourModalViewControllerReference animated:NO]; 

(其中「自我」應該是你最初用來打開模態視圖控制器控制器)

33

有這允許您隱藏鍵盤呈現模態對話框時有幫助的方法:

- (BOOL)disablesAutomaticKeyboardDismissal { return NO; } 

這將覆蓋Apple設置的模式對話框的默認行爲,並允許您關閉鍵盤。它在UIViewController類中。

我希望這可以幫助別人!

+1

這個行爲在Apples部分是有意的。閱讀disablesAutomaticKeyboardDismissal的文檔。謝謝託尼,這對我有很大的幫助! – 2012-08-16 15:36:54

+1

這個解決方案很好。如果您正在尋找修補程序,請嘗試。爲我工作。 – Sparklellama 2012-11-20 22:43:44

+0

你把這個代碼放在哪裏?我的文本字段在tableviewcell中。 – 2012-12-20 20:26:18

0

最簡單的方法是:

  1. 轉到您的用戶界面生成器,

  2. 選擇UITextField和「控制,拖動」到「詳細信息視圖控制器,詳細介紹」和釋放。

  3. 窗口會彈出。然後在「Outlets」下選擇「Delegate」。

就是這樣。它爲我工作。

7

這個解決方案在上述任何一種情況下都適用。在呼叫resignFirstResponder後,我添加了一個模式視圖&刪除它。



    [myTextField resignFirstResponder]; 
    UIViewController *dummyController = [[UIViewController alloc] init]; 
    UIView *dummy = [[UIView alloc] initWithFrame:CGRectMake(-1, -1,1,1)]; 
    [dummyController setView:dummy]; 
    [self presentModalViewController:dummyController animated:NO]; 
    [dummyController dismissModalViewControllerAnimated:NO]; 

+2

我不喜歡它,但這對我有用 – MCR 2013-01-14 19:43:34

+0

鍵盤動畫不見了(就像我的動畫一樣),但是,這是唯一適用於我的解決方案 – Kalle 2014-12-04 06:01:48

3

的Xcode 4.5.1

只需點擊控制,然後在文本字段拖動並釋放.H文件

控制鍵+拖動

然後在彈出菜單中選擇

connection=acton; 
name= any name; 
type=id; 
event=did end on exit; 
arguments=sender; 

然後點擊連接按鈕

0

如果你是在UIModalPresentationFormSheet就叫

- (BOOL)disablesAutomaticKeyboardDismissal 
{ 
    return NO; 
} 
+1

我已經在近一年前給出了答案 - 僅供參考。:) – 2014-08-04 13:51:03

1

我看了一下這個問題,在屏幕鍵盤拒絕當你調用resignFirstResponder隱藏這麼多的文章,但沒有任何建議爲我工作。

我正在使用XCode 5(iOS 7)並且有一個iPhone屏幕包含需要屏幕鍵盤的幾個控件,但是如果用戶單擊了UIButton,那麼我希望鍵盤消失。

enter image description here

我大概浪費了一整天與resignFirstResponder試驗和增加disablesAutomaticKeyboardDismissal函數返回NO,但毫無效果。一旦屏幕鍵盤出現,我再也無法讓它消失。

但後來我有一個小腦波(因爲我只有一個小腦袋)。

現在,當用戶點擊我的UIButton,我只是禁用UITextFieldUITextView控制。

- (IBAction)btnDate_Tapped:(id)sender { 
    // The user has clicked on the "Date" button. 
    self.tbClientName.enabled = NO; 
    self.tbComments.editable = NO; 

突然之間,應用發現它沒有任何可編輯的文本字段需要一個屏幕上的鍵盤,它巧妙地滑過鍵盤淡出人們的視線。

(緩解嘆息。)

我的UIButton實際上會彈出一個對話框。當用戶關閉彈出窗口時,我重新啓用這兩個控件,因此如果用戶點擊其中一個控件,鍵盤將再次出現。

-(void)popoverControllerDidDismissPopover:(UIPopoverController *) popoverController { 
    // The user has closed our popup dialog. 
    // We need to make our UITextField and UITextView editable again. 
    self.tbClientName.enabled = YES; 
    self.tbComments.editable = YES; 
    ... etc... 
} 

簡單,不是嗎!

令人驚訝的是,這種解決方法甚至適用於UIViewControllers,它們出現在模式樣式中。

我希望這可以幫助其他XCode受害者。

+0

請幫助我也一直在這一整天掙扎!我已經做了你所說的一切,還有什麼可能在你的應用程序中有所不同,我可以在我的程序中改變它? – 4GetFullOf 2014-04-22 22:10:04

+0

你的按鈕在哪裏? – fatuhoku 2014-05-07 13:48:07

+0

我的UIButton顯示在上面的屏幕截圖中(顯示日期/時間)。當用戶點擊這個時,我想讓onscren鍵盤消失,並出現一個彈出窗口,他們可以選擇一個日期。 – 2014-05-09 08:46:37

0

雨燕3.0:

override var disablesAutomaticKeyboardDismissal: Bool { 
    get{ 
     return false 
    } 
    set { 
     self.disablesAutomaticKeyboardDismissal = false 
    } 
} 
0

雨燕3.0

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { 

    if textField == addressTextField { 
     textField.resignFirstResponder() 

     return false 
    } 

    return true 
}