2

所以我正在制作一个应用程序,并且在从 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被dismiss如下:

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

任何帮助表示赞赏,谢谢。

4

4 回答 4

4

好的,我弄清楚了问题所在。他们的第一响应者正在辞职,但由于焦点问题,键盘并没有消失。模态视图有一个默认行为是不关闭键盘(这显然不是一个错误)。因此,从模态视图返回后,它仍然存在这种行为(辞职第一响应者但不关闭键盘)。我解决这个问题的方法是将以下代码放在两个模态视图 .m 文件中:

- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}

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

[search resignFirstResponder];

或者

[self.view endEditing: YES];

键盘会很好地关闭!

于 2013-04-15T15:25:17.847 回答
0

您需要使用断点进行一些调试,以找出为什么没有命中该条件语句。您还可以使用 UIView 中的 endEditing 方法在单击搜索时简单地退出响应者:

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

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

于 2013-04-08T15:32:38.187 回答
0

尝试一下....

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

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

希望这有帮助

于 2013-04-11T11:53:24.733 回答
0

(一年后..)

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

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

[self.pleaseRegisterDlg removeFromParentViewController];

现在,当我从 XCode 以调试模式在真实设备上运行这段代码时,故事就到此结束了。一切都很好。但是当我用这段代码构建一个In-House 应用程序时,它的行为就不同了。

我会发现,有时,无论我在代码中输入了多少,有时resignFirstResponders屏幕disablesAutomaticKeyboardDismissals键盘会突然出现,并且拒绝以编程方式消失。

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

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

[self.pleaseRegisterDlg removeFromParentViewController];
pleaseRegisterDlg = nil;

显然,拥有一个UIView实际上并未附加到任何其他UIViews但包含UITextFields的内容有时足以混淆iOS,并使屏幕键盘出现。

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

于 2014-10-16T07:35:35.417 回答