解决Keyboard FirstResponder问题

时间:2013-04-08 15:21:57

标签: ios objective-c keyboard uisearchbar resignfirstresponder

所以我正在创建一个应用程序,并且在从UISearchBar和UITextFields中解除键盘方面遇到了一些问题。这是我的应用程序的结构:

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];

感谢任何帮助,谢谢。

4 个答案:

答案 0 :(得分:4)

好的,我想出了问题所在。他们的第一响应者正在辞职,但由于焦点问题键盘没有消失。模态视图上有一个默认行为,不会解除键盘(这显然不是一个bug)。因此,从模态视图返回后,它仍然具有此行为(辞职第一响应者但不解除键盘)。我解决这个问题的方法是将以下代码放在模态视图.m文件中:

- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}

这为我解决了。然后使用:

[search resignFirstResponder];

[self.view endEditing: YES];

键盘会解散!

答案 1 :(得分:0)

您需要使用断点进行一些调试,以找出未触发条件语句的原因。你也可以在UIView中使用endEditing方法,只要在点击搜索时简单地重新签名响应者:

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

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

答案 2 :(得分:0)

试试吧......

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

请声明IBOutlet UISearchBar * mySearchBar;在你的.h文件中 在.xib文件中设置委托。

希望这有帮助

答案 3 :(得分:0)

(一年后......)

我的iPad应用程序遇到了同样的问题。

我有一个“请注册”UIView,其中包含一些我会弹出到屏幕上的UITextFields。当用户点击“关闭”按钮时,它会消失,我会使用removeFromParentViewController来消除它。

[self.pleaseRegisterDlg removeFromParentViewController];

现在,当我在XCode的调试模式下在真实设备上运行此代码时,故事就此结束了。一切都很好。但是,当我使用此代码构建内部应用程序时,其行为方式不同。

我会发现,有时候,无论我在代码中添加多少resignFirstRespondersdisablesAutomaticKeyboardDismissals,屏幕键盘都会突然出现,并拒绝以编程方式消失。< / p>

这没有任何意义,因为我的应用程序的其余部分没有任何UITextFields ...应用程序没有理由显示键盘。

我的解决方案是在从父视图中删除后将“请注册”UIView设置为nil。

[self.pleaseRegisterDlg removeFromParentViewController];
pleaseRegisterDlg = nil;

显然,让UIView实际上没有附加到任何其他UIViews但包含UITextFields的{​​{1}}有时足以混淆iOS,并使屏幕键盘显示。

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