ios - UIWindow 不显示 iOS 13 中的内容

标签 ios swift uiwindow ios13 uiscenedelegate

我正在升级我的应用程序以使用 iOS 13 中定义的新 UIScene 模式,但是该应用程序的一个关键部分已停止工作。 我一直在使用 UIWindow 来覆盖屏幕上的当前内容并向用户呈现新信息,但在我正在使用的当前测试版 (iOS + XCode beta 3) 中,窗口会出现,但马上就消失了。

这是我使用的代码,现在不起作用:

let window = UIWindow(frame: UIScreen.main.bounds)
let viewController = UIViewController()
viewController.view.backgroundColor = .clear
window.rootViewController = viewController
window.windowLevel = UIWindow.Level.statusBar + 1
window.makeKeyAndVisible()
viewController.present(self, animated: true, completion: nil)

我已经尝试了很多方法,包括使用 WindowScenes 来呈现新的 UIWindow,但找不到任何实际的文档或示例。

我的一次尝试(没有用 - 与窗口出现和立即关闭的行为相同)

let windowScene = UIApplication.shared.connectedScenes.first
if let windowScene = windowScene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
    let viewController = UIViewController()
    viewController.view.backgroundColor = .clear
    window.rootViewController = viewController
    window.windowLevel = UIWindow.Level.statusBar + 1
    window.makeKeyAndVisible()
    viewController.present(self, animated: true, completion: nil)
}

在 iOS 13 测试版中有人能够做到这一点吗?

谢谢

编辑

从提出这个问题到 iOS 13 的最终版本发布已经过去了一段时间。下面有很多答案,但几乎所有答案都包含一件事——Adding a strong/stronger reference to the UIWindow。您可能需要包含一些与新场景相关的代码,但请先尝试添加强引用。

最佳答案

我在为 iOS 13 场景模式升级代码时遇到了同样的问题。使用您的第二个代码片段的一部分,我设法修复了所有问题,因此我的窗口再次出现。除了最后一行,我和你做的一样。尝试删除 viewController.present(...)。这是我的代码:

let windowScene = UIApplication.shared
                .connectedScenes
                .filter { $0.activationState == .foregroundActive }
                .first
if let windowScene = windowScene as? UIWindowScene {
    popupWindow = UIWindow(windowScene: windowScene)
}

然后我像你一样展示它:

popupWindow?.frame = UIScreen.main.bounds
popupWindow?.backgroundColor = .clear
popupWindow?.windowLevel = UIWindow.Level.statusBar + 1
popupWindow?.rootViewController = self as? UIViewController
popupWindow?.makeKeyAndVisible()

无论如何,我个人认为问题出在 viewController.present(...) 中,因为您显示一个带有该 Controller 的窗口并立即显示一些“ self ”,所以这取决于什么“ self ”确实是。

另外值得一提的是,我在我的 Controller 中存储了对您正在移动的窗口的引用。如果这对你还是没用我只能展示我的小repo使用此代码的。查看 AnyPopupController.swiftPopup.swift 文件。

希望对您有所帮助,@SirOz

关于ios - UIWindow 不显示 iOS 13 中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57060606/

相关文章:

swift - 如何修复线程 1 : Fatal error: Unexpectedly found nil for UIScrollView

ios - SwiftUI 将按钮点击发送到 subview

swift - 我必须以编程方式添加按钮列表

ios - iOS9.1 UIWindow 删除错误

ios - UIWindow中的UIScreen属性有什么用?

javascript - 如何判断我是否在使用 Ionic2 的移动平台上?

ios - 更新表格 View 中的条目(编辑后)并在表格 View 中显示时出现问题

ios - 无法在多点连接 iOS 10 中通过蓝牙连接

iphone - ios应用崩溃

iphone - 从 UIViewController 方法更改 UIWindow 的呈现 View