iOS 9 - UIAlertView 关闭后弹出键盘

Posted

技术标签:

【中文标题】iOS 9 - UIAlertView 关闭后弹出键盘【英文标题】:iOS 9 - Keyboard pops up after UIAlertView dismissed 【发布时间】:2015-09-23 15:55:06 【问题描述】:

我有一个奇怪的视觉错误,只影响 ios 9 设备:

我的应用程序登录 UIViewController 在您点击按钮时运行并获得 OAuth 令牌,就像您期望的那样。如果我的 API 的响应返回一个特定的状态码,我会弹出一个 UIAlertView 说他们需要重置密码(如果他们在服务器端被标记为这样)。点击按钮后用于登录resignFirstResponder 的电子邮件和密码字段,标准的东西。

仅在 iOS 9 上,如果您点击重置路径,则在该警报视图上点击确定的那一刻,键盘会弹回,可能持续 800 毫秒,然后再次关闭。就好像有什么东西在排队显示它,但是警报的存在阻止了它,直到你点击 OK - 在警报上点击 OK 后绝对是瞬间的。

调试起来似乎非常棘手。我已将符号断点添加到 becomeFirstResponder,并且在此过程发生附近的任何地方都不会调用它。

关于如何查看调试/修复此问题的任何其他想法?它不影响 iOS 7 和 iOS 8,只影响 iOS 9。

【问题讨论】:

【参考方案1】:

我在大约 30 分钟前遇到了这个问题。

自 iOS9 发布以来,UIAlertView 已被弃用。

我们通过使用 UIAlertController 解决了这个问题,如下所示:

 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert Title!" message:@"This is an alert message." preferredStyle:UIAlertControllerStyleAlert];

     UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
     [alertController addAction:ok];

     [self presentViewController:alertController animated:NO completion:nil];

这应该可以解决您的问题。

如果动画 = YES,您可能会遇到与以前相同的问题。这是iOS9的一个错误。

让我知道它是怎么回事,如果这能解决您的问题。

【讨论】:

请注意 UIAlertController 仅在 iOS 8 之后可用。如果您的目标包括 iOS 7 用户,请谨慎处理。 谢谢!节省了我用头撞墙的时间【参考方案2】:

这是一个在 swift 3 中处理这个问题的扩展

extension UIViewController 

    func presentOk(with title: String, and message: String, handler: ((UIAlertAction) -> Void)?) 

        let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)

        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: handler))

        OperationQueue.main.addOperation 
            self.view.endEditing(true)
            self.present(alert, animated: true, completion: nil)
        
    

关键是隐藏键盘并将控制器呈现在主队列中。

用法

presentOk(with: "My app title", and: "this is the alert message", handler: nil)

【讨论】:

以上是关于iOS 9 - UIAlertView 关闭后弹出键盘的主要内容,如果未能解决你的问题,请参考以下文章

关闭后弹出视图控制器

Flutter - 选择项目后弹出菜单未关闭

如何让 UIAlertView 在 iPhone 应用程序第一次启动时只出现一次?

当应用程序关闭或在后台运行时弹出 UIAlertView 窗口

layui使用弹出层 关闭后弹层的内容又显示出来

升级到 iOS 11 后弹出错误的位置