iOS 9-点击UIAlertView后键盘弹出

5
我有一个奇怪的视觉错误,只影响iOS 9设备:
我的应用程序的登录UIViewController在按下按钮时会获取OAuth令牌,就像您期望的那样。如果来自我的API的响应返回特定的状态代码,则会弹出一个UIAlertView,表示他们需要重置密码(如果他们在服务器端被标记为这样)。登录的电子邮件和密码字段会在按下按钮后resignFirstResponder,这是标准的操作。
仅在iOS 9上,如果您选择重置路径,则在单击该警报视图上的确定后的第二个,键盘会重新弹出,大约持续800毫秒,然后再次消失。几乎就好像有些东西排队等待呈现它,但警报的存在阻止了它直到您点击“确定”为止-点击警报后立即完成。
这似乎是一个非常棘手的调试问题。我已经添加了符号断点到becomeFirstResponder,并且它没有在此过程发生附近被调用。
您还有其他的想法可以帮助我调试/修复此问题吗?它不影响iOS 7和iOS 8,仅影响iOS 9。
2个回答

16

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

自从iOS 9发布以来,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];

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

如果animated = YES,你可能会遇到之前相同的问题。这是iOS9的一个错误。

让我知道它的执行情况,以及这是否解决了你的问题。


2
请注意,UIAlertController仅适用于iOS 8及以上版本。如果您的目标用户包括iOS 7用户,请小心处理。 - Summer
谢谢!你救了我好几个小时的时间,让我不再一头撞在墙上。 - Josh O'Connor

0

这是一个处理 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接