【问题标题】:Dismissing Keyboard FirstResponder problems消除键盘 FirstResponder 问题
【发布时间】:2013-03-30 18:19:25
【问题描述】:

所以我正在制作一个应用程序,但在从 UISearchBar 和 UITextFields 解除键盘时遇到了一些问题。这是我的应用程序的结构:

NavigationController -> ViewC1 - (Modally)-> ViewC2 -(Modally) -> 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];

感谢任何帮助,谢谢。

【问题讨论】:

  • 我建议调试你的搜索按钮点击方法。搜索栏及其代表是否仍被分配?此时搜索是否也被视为第一响应者?
  • @Ben M:它仍然被识别为 firstResponder,因此在触发委托方法时它仍然分配了委托。

标签: ios objective-c keyboard uisearchbar resignfirstresponder


【解决方案1】:

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

- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}

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

[search resignFirstResponder];

[self.view endEditing: YES];

键盘会正常关闭!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我在 if else 语句中添加了一条日志语句,从 ViewC3 返回后,它声称它是第一响应者,但是仍然没有关闭键盘?我还尝试了您对 [search endEditing:YES] 的建议,它的行为完全相同。第一次工作,但从 ViewC3 返回后它不会关闭键盘。
    • 所以澄清一下,您的调试器显示您的搜索栏是第一响应者,您已经在条件内的行上放置了一个断点,如果它是您的搜索栏,则放弃第一个响应者,该行已执行,第一响应者仍然是您的搜索栏?
    • 调试后我可以确认 if 语句被输入两次(第一次和从 ViewC3 返回后)表明它是第一响应者,然后辞去第一响应者。两次都一样,但由于某种原因,键盘仍然没有被关闭
    【解决方案3】:

    试试看……

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

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

    希望对你有所帮助

    【讨论】:

    • 这就是它已经设置好的方式。搜索栏在 .h 文件中声明为 IBOutlet,其委托在 .m 文件的 viewDidLoad 方法中设置。搜索栏委托方法的设置如我的问题所示。
    • @sj.cleaver : 请在 .xib 中设置委托
    • 我尝试在情节提要中设置委托(不使用 .xib)但仍然遇到完全相同的问题
    • @sj.cleaver : 在 .h 文件中设置
    • @sj.cleaver :设置断点并检查您的函数是否被调用。告诉我发生了什么。
    【解决方案4】:

    (一年后..)

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

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

    [self.pleaseRegisterDlg removeFromParentViewController];
    

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

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

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

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

    [self.pleaseRegisterDlg removeFromParentViewController];
    pleaseRegisterDlg = nil;
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多