【问题标题】:No longer able to hide keyboard during viewWillDisappear in iOS7在 iOS7 中 viewWillDisappear 期间不再能够隐藏键盘
【发布时间】:2013-12-17 14:12:54
【问题描述】:

以下代码在 iOS6 中用于在视图控制器从导航堆栈中弹出时隐藏键盘:

- (void)viewWillDisappear:(BOOL)animated {
    [self.view endEditing:YES];
    [super viewWillDisappear:animated];
}

但是,在 iOS7 中,[self.view endEditing:YES] 行似乎被忽略了。我在其他视图事件(viewDidDisappear、viewWillAppear 和 viewDidAppear)中尝试了该命令,它唯一起作用的是 viewDidAppear。似乎一旦启动“弹出”,我们就无法隐藏键盘,直到视图控制器被“推”回堆栈。

虽然将代码放入 viewDidAppear 确实可以隐藏键盘,但不好的是,当 viewController 被推回导航堆栈时,键盘会短暂显示...从 UI 角度来看这是不可接受的。

还有其他人成功解决了这个问题吗?我不希望自己编写 CANCEL 按钮,但现在,这是我能想到的唯一可行的方法。

【问题讨论】:

  • 我完全按照您在viewWillDisappear: 中发布的内容进行操作,它对我有用。键盘消失了,UITextField 调用了它的“结束编辑”委托。我刚刚在运行 iOS 7.0.4 的设备上验证了这一点。我所做的只是点击“返回”按钮来弹出视图控制器。
  • 我在 7.0.3。我会尝试升级,看看会发生什么。
  • 我真的怀疑这是 7.0.3/7.0.4 的问题。您是否实现了任何可能阻止文本字段/视图退出第一响应者的委托方法?
  • 你说得对,这不是 7.0.3/7.0.4 的问题。我正在实现 textFieldShouldBeginEditing、textFieldDidBeginEditing 和 textFieldDidEndEditing 方法。我评论了这些,但仍然有同样的问题。不过你确实给了我一个想法。我在发出“pop”命令之前和之后检查了当前活动文本字段的 canResignFirstResponder 属性。在 pop 命令之前, canResignFirstResponder 为真。在弹出命令之后,它是错误的。我还没有在我的代码中发现任何可能导致这种情况的东西,但我会继续挖掘。
  • 更正:canResignFirstResponder 在我发出 pop 命令之前和之后都是真的。然而,它在 viewWillDisappear 中变成了假的。

标签: ios objective-c ios7 keyboard xcode5


【解决方案1】:

如果是UITextView,请将editable 属性设置为NO。我试过这个,它一设置就隐藏键盘。我没有用UITextField 尝试过,但我猜你将enabled 属性设置为NO 会得到相同的结果。如果这不起作用,请创建一个UITextField,并将userInteractionEnabled 设置为NO 作为透明UITextView 的背景,并使用上述editable 属性。

【讨论】:

  • 好答案。这实际上是唯一对我有用的东西。在 textViewShouldEndEditing 期间将 UITextView 的可编辑设置为 0,然后在将该视图控制器推回堆栈时重新启用它。
【解决方案2】:

iOS 7 中有一个变化,默认情况下显示为模态表单的视图控制器无法关闭键盘。要解决此问题,您需要覆盖视图控制器的 disablesAutomaticKeyboardDismissal 方法并返回 NO

【讨论】:

  • 我试过这个没有成功。我在视图控制器中添加了以下几行,键盘仍然可见
  • (请忽略之前的评论...被拉开并用完了 5 分钟的窗口编辑时间)我试过这个,但键盘仍然可见。我在我的视图控制器中为 disablesAutomaticKeyboardDismissal 返回了 NO,而对于踢球,我什至将它添加到导航控制器和导航层次结构中的前一个视图控制器中。经检查,当前文本字段的 canResignFirstResponder 属性在 viewWillDisappear 启动时仍为 NO,因此它仍然没有松开键盘。
  • 这个方法没有被调用 ios 7
【解决方案3】:

问题是,在我按下“BACK”按钮和 viewWillDisappear 触发的时间之间,当前文本字段的 canResignFirstResponder 被设置为 FALSE,这会阻止键盘隐藏。我无法在我的代码中发现任何可能导致此问题的内容,并且我强烈怀疑这可能是某种 iOS 7 错误,因为相同的代码在 iOS 6 下也适用于我。

作为一种解决方法,我实施了以下解决方案。我继承了 UINavigationController 并覆盖了以下方法:

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
    [self.topViewController.view endEditing:YES];
    return [super popViewControllerAnimated:animated];
}

当我点击返回按钮弹出当前视图控制器时,这会导致键盘适当地消失。无需编写一堆自定义的后退按钮,我松了一口气。

【讨论】:

  • 那么在第二个很明显它不会到达[self.topViewController.view endEditing:YES];,因为你在它之前返回,返回之后的任何代码都不会看到光明。而且我不会说有趣的是,您基本上重写了该方法只是为了将其称为超级并且什么都不做,所以就像您甚至从未对它做过任何事情一样。
  • 呃,现在我觉得很害羞!好吧,我更正了代码(上面编辑版本中的更正)并以相同的结果重新测试了它。在运行 [super popViewControllerAnimated] 之后调用 endEditing 导致键盘没有像应有的那样隐藏。
  • 没关系....我一直盯着这种方式太久了。那显然也行不通。 topViewController 已经弹出,因此无论如何我都不会在我想要的控制器上调用 endEditing。我正在重新编辑评论以删除我声明的第二部分以避免混淆。
  • @AlanKeele 偶然发现了你的问题,我也想关闭键盘。不确定它是否适合您,但我只是在 viewWillDisappear 中使用了 [my_textfield resignFirstResponder] 并且每次都会关闭键盘。
【解决方案4】:

文本框失去焦点时隐藏键盘

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{

  if ([textField isFirstResponder])
        [textField resignFirstResponder];

    return YES;
}

【讨论】:

    【解决方案5】:

    我尝试了一种解决方法。这可能不是你们所期望的。

    如果您使用故事板,您可以在“prepareForSeuge”方法中退出键盘。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
        [self.view endEditing:YES];
    }
    

    对我来说效果很好。

    【讨论】:

      【解决方案6】:

      下面给出的方法肯定会在iOS7中隐藏状态栏。

      - (BOOL)prefersStatusBarHidden
      {
          return YES;
      }
      

      将此添加到您的 .plist 文件中(转到应用程序设置中的“信息”)

      View controller-based status bar appearance --- NO
      

      然后你可以调用这行来隐藏状态栏:

      [[UIApplication sharedApplication] setStatusBarHidden:YES];
      

      如果您的应用仅支持 iPhone,当您在 iPad 上运行应用时,状态栏不会隐藏。

      【讨论】:

        【解决方案7】:

        将您的 UItextfield 或 UItextview 用于全局声明。

        UITextfield textfield = 你的文本域对象;

        -(void)viewWillDisappear:(BOOL)animated 
        {
        
            [self.view endEditing:YES];
            [textfield resignFirstResponder];
            [super viewWillDisappear:animated];
        }
        

        【讨论】:

          猜你喜欢
          • 2013-11-08
          • 2011-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-17
          • 2011-03-24
          • 2010-10-01
          • 2020-10-12
          相关资源
          最近更新 更多