所以我正在创建一个应用程序,并且在从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];
感谢任何帮助,谢谢。
答案 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];
}
答案 2 :(得分:0)
试试吧......
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
[mySearchBar resignFirstResponder];
}
请声明IBOutlet UISearchBar * mySearchBar;在你的.h文件中 在.xib文件中设置委托。
希望这有帮助
答案 3 :(得分:0)
(一年后......)
我的iPad应用程序遇到了同样的问题。
我有一个“请注册”UIView,其中包含一些我会弹出到屏幕上的UITextFields
。当用户点击“关闭”按钮时,它会消失,我会使用removeFromParentViewController
来消除它。
[self.pleaseRegisterDlg removeFromParentViewController];
现在,当我在XCode的调试模式下在真实设备上运行此代码时,故事就此结束了。一切都很好。但是,当我使用此代码构建内部应用程序时,其行为方式不同。
我会发现,有时候,无论我在代码中添加多少resignFirstResponders
或disablesAutomaticKeyboardDismissals
,屏幕键盘都会突然出现,并拒绝以编程方式消失。< / p>
这没有任何意义,因为我的应用程序的其余部分没有任何UITextFields
...应用程序没有理由显示键盘。
我的解决方案是在从父视图中删除后将“请注册”UIView
设置为nil。
[self.pleaseRegisterDlg removeFromParentViewController];
pleaseRegisterDlg = nil;
显然,让UIView
实际上没有附加到任何其他UIViews
但包含UITextFields
的{{1}}有时足以混淆iOS,并使屏幕键盘显示。
(叹息。这一行代码浪费了我下午的几个小时......上了一课!)