2013-04-08 85 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

(叹息。的这一行代码浪费了我下午..教训!几个小时)