当前位置: 首页 > 面试题库 >

从iOS 13开始,每个UIAlertController都会在用户响应之前自动消失

东明德
2023-03-14
问题内容

由于我使用的是iOS 13,因此我的每个UIAlertController都会显示大约半秒钟,并在用户执行任何操作之前立即消失。任何想法 ?

当我从应用程序的不同部分使用UIAlertController时,我使用了一个扩展,该扩展使我既可以从经典视图又可以从collectionView(单元格,标头等)弹出。

public extension UIAlertController {
    func show() {
        let win = UIWindow(frame: UIScreen.main.bounds)
        let vc = UIViewController()
        vc.view.backgroundColor = .clear
        vc.view.tintColor = Theme.mainAccentColor
        win.rootViewController = vc
        win.windowLevel = UIWindow.Level.alert + 1
        win.makeKeyAndVisible()
        vc.present(self, animated: true, completion: nil)
    }
}

这是此扩展名用法的示例:

fileprivate func showMissingAlert() {
        let alert = UIAlertController(title: "blablabla", message: "blablablablabla blabla", preferredStyle: UIAlertController.Style.alert)
        alert.show()
        alert.view.tintColor = Theme.mainAccentColor
        let cancelAction = UIAlertAction(title: "OK, blabla", style: .default, handler: {(alert: UIAlertAction!) in print("ok, leave")})
        alert.addAction(cancelAction)
    }

进一步在我的代码中:

showMissingAlert()

在iOS 13之前,每个UIAlert都可以正常工作…自从我移至iOS 13甚至iOS 13.1以来,它就变得一团糟… :(

  • 关于什么可能导致此的任何想法?

  • 以及如何防止将UIAlert用作潜意识消息:)?


问题答案:

我遇到了完全相同的问题,并通过将警报显示在一个强变量中的窗口中进行修复。

例如,您可以在AppDelegate中保留一个用于显示警报的窗口,并在UIAlertController扩展中使用它。

//In app delegate
let alertWindow: UIWindow = {
    let win = UIWindow(frame: UIScreen.main.bounds)
    win.windowLevel = UIWindow.Level.alert + 1
    return win
}()

然后,在您的扩展程序中:

public extension UIAlertController {
    func show() {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let vc = UIViewController()
        vc.view.backgroundColor = .clear
        vc.view.tintColor = Theme.mainAccentColor
        appDelegate.alertWindow.rootViewController = vc
        appDelegate.alertWindow.makeKeyAndVisible()
        vc.present(self, animated: true, completion: nil)
    }
}

您还需要确保在关闭警报时将警报窗口从视图中删除,否则您的应用将变得无响应,因为所有轻按都将由(不可见的)警报窗口处理,这仍然是所有问题的重中之重。为此,我将以下代码添加到警报中所有操作的处理程序中:

(UIApplication.shared.delegate as! AppDelegate).alertWindow.isHidden = true


 类似资料:
  • 问题内容: 我有一个测试套件,可以在其中退出系统并在中关闭浏览器。我尝试使用每种测试方法都使用Selenium拍摄失败的测试屏幕截图。我手动检查了它只在每个之前运行,但我想在它之前和之后进行设置。我找不到简单的解决方案。任何帮助将不胜感激。 我得到的输出是 问题答案: 由于规则的设置方式,因此不能有@before之后或@after之后的规则。您可以想到放在测试方法上的诸如shell之类的规则。要进

  • 我有一个场景,我试图在Cordova的deviceready事件上初始化我的应用程序。现在,这个初始化序列需要几秒钟的时间来执行。这导致总发射时间远大于预期。我的问题是,是否可以简单地与即将推出的Cordova API和插件并行运行此初始化序列? 注意:初始化没有利用API或插件中的任何内容,所以我不能简单地在加载时立即运行它,而不是在onDeviceReady上运行它吗?

  • 问题内容: 每当我对应用程序中的其余控制器发出请求以允许跨源资源共享时,我想将此标头添加到对客户端的每个响应中,目前我正在手动添加每个这样的方法的标头 它的工作,但非常令人沮丧。我在Spring文档中找到了webContentInterceptor,它允许我们修改每个响应的标头 但是当我使用它时,它会引发错误,即找不到名称为Access-Control-Allow-Origin的属性,因此还有其他

  • 有许多linux发行版可以选择. 我们将会选择三种流行的发行版来尽可能的包括所有听众来避免发行版战争. 基于他们使用系统的包管理系统, 许多linux发行版分成2组. 一组使用RPM(Red Hat Package Manager), 而另一组使用dpkg包管理器. 我们选择两种基于RPM的发行版, CentOS和SUSE, 在企业中流行. 取代使用Debian作为一个基于dpkg的发行版, 我们

  • 如果你刚从后端转到前端,可能会被目前前端(表面的)工程复杂度惊吓到,但是放心,使用 vue-cli 从模板创建项目可以快速开始编码、构建,仅仅是几行简单的命令不是么? 在使用 VUX 之前需要你至少已经会使用 Vue,同时需要你大概了解 Node.js,npm,cnpm,yarn 这些东西。 建议 Node.js 版本在 7.6.0 以上。 相关工具 WeUI VUX 样式基于 WeUI,但是你不

  • 每当从我的要素文件开始执行新方案时,就会启动一个新浏览器。我希望浏览器只在我的第一个场景执行时启动一次,在场景的其余部分,不应打开新的浏览器。 我已经把我的浏览器打开代码写进了类下的注释中。