2013-04-08 116 views
2

因此,我正在製作一個應用程序,並有解除鍵盤從UISearchBar和UITextFields的一些問題。這裏是我的應用程序的結構:解僱鍵盤FirstResponder問題

NavigationController - (模態) - - > ViewC1 - (模態) - > ViewC2> ViewC3

我在ViewC1一個搜索框,並在 「搜索」 按鈕鍵盤被按下鍵盤被解僱,這工作正常。但是,如果我在ViewC3中返回到ViewC1,那麼當按下「搜索」按鈕時鍵盤不再解除。在搜索欄的委託方法我已經把如下:

- (void) searchBarSearchButtonClicked:(UISearchBar *)search 
{ 
if ([search isFirstResponder]) { 
    [search resignFirstResponder]; 
    } else { 
    [search becomeFirstResponder]; 
    [search resignFirstResponder]; 
    } 
} 

這不解決問題,我不知道爲什麼鍵盤不解僱。作爲參考,當返回到原始ViewC1時,ViewC3被解除如下:

UIViewController *parent = self.presentingViewController; 
[parent.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 

任何幫助表示讚賞,謝謝。

+0

我建議調試搜索按鈕單擊方法。搜索欄及其代理是否仍然分配?在這一點上搜索也被認爲是第一響應者? – 2013-04-08 15:24:28

+0

@Ben M:它仍然被認爲是第一個響應者,因此它在觸發委託方法時仍然分配了委託。 – 2013-04-13 09:43:38

回答

4

好吧,我想清楚是什麼問題。他們的第一響應者正在辭職,但由於焦點問題,鍵盤並未消失。在模式視圖上有一個默認行爲,不能關閉鍵盤(這顯然不是一個錯誤)。所以從模態視圖返回後,它仍然有這種行爲(辭退第一響應者,但不是解僱鍵盤)。我解決這個問題的方法是通過將下面的代碼在這兩種模態的看法.m文件:

- (BOOL)disablesAutomaticKeyboardDismissal { 
return NO; 
} 

這解決了這個問題對我來說。然後通過或者使用:

[search resignFirstResponder]; 

[self.view endEditing: YES]; 

鍵盤將解僱罰款!

0

您需要用斷點進行一些調試才能找出條件語句未被命中的原因。你也可以使用endEditing方法的UIView簡單地辭職響應每次單擊搜索:

- (void) searchBarSearchButtonClicked:(UISearchBar *)search 
     [search endEditing:YES]; 
} 

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIView_Class/UIView/UIView.html

+0

我在if else語句中添加了一條日誌語句,從ViewC3返回後聲明它是第一個響應者,但仍不排除鍵盤?我也嘗試了[搜索endEditing:YES]的建議,它具有完全相同的行爲。第一次工作,但從ViewC3返回後,它不會關閉鍵盤。 – 2013-04-08 16:08:57

+0

爲了澄清一下,你的調試器顯示你的搜索欄是第一個響應者,你在你的條件內放置了一個斷點,如果它是你的搜索欄,那麼這個行將被執行,並且第一個響應者仍然是你的搜索欄? – ahtierney 2013-04-08 17:14:52

+0

調試後,我可以確認if語句同時輸入(第一次和從ViewC3返回後),表明它是第一響應者,然後辭去第一響應者。它的表現相同,但由於某些原因,鍵盤仍然沒有被解僱 – 2013-04-08 17:30:05

0

試試吧....

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [mySearchBar resignFirstResponder]; 
} 

請聲明IBOutlet中的UISearchBar * mySearchBar ;在你的.h文件中
在你的.xib文件中設置委託。

希望這對我有幫助

+0

這就是它已經全部建立的原因。搜索欄在.h文件中聲明爲IBOutlet,其代理在.m文件的viewDidLoad方法中設置。搜索欄委託方法設置如我的問題所示。 – 2013-04-11 15:14:19

+0

@ sj.cleaver:請將代理設置爲.xib – 2013-04-12 04:07:06

+0

我嘗試在故事板中設置代理(不使用.xib),並且仍然有完全相同的問題 – 2013-04-13 09:44:57

0

(一年後..)

我剛剛有同樣的問題與我的iPad應用程序。

我有一個「請註冊」UIView包含幾個UITextFields,我會彈出到屏幕上。當用戶點擊關閉按鈕時,它會消失,我會用removeFromParentViewController來擺脫它。

[self.pleaseRegisterDlg removeFromParentViewController]; 

現在,當我在XCode調試模式下的真實設備上運行此代碼時,故事結束了。它一切正常。但是,當我用此代碼構建內部應用程序時,它的行爲有所不同。

我會發現有時,無論我將多少個resignFirstRespondersdisablesAutomaticKeyboardDismissals放入代碼中,屏幕鍵盤會突然出現,並拒絕以編程方式消失。

它沒有任何意義,因爲我的應用程序的其餘部分沒有任何UITextFields ...沒有理由讓應用程序顯示鍵盤。

我的解決方案是將「請註冊」UIView從父視圖中刪除後設置爲零。

[self.pleaseRegisterDlg removeFromParentViewController]; 
pleaseRegisterDlg = nil; 

顯然,具有實際上不依附於任何其他UIViews但其中包含UITextFields有時足以混淆的iOS,使屏幕鍵盤出現UIView

(嘆息。的這一行代碼浪費了我下午..教訓!幾個小時)