我正在升级应用程序以使用UISceneiOS 13中定义的新模式,但是该应用程序的关键部分已停止工作。我一直在使用a UIWindow来覆盖屏幕上的当前内容并向用户显示新信息,但是在我正在使用的当前Beta(iOS + XCode beta 3)中,该窗口会出现,但随后会立即消失。
UIScene
UIWindow
这是我正在使用的代码,现在无法使用:
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,但是却找不到任何实际的文档或示例。
WindowScenes
我的尝试之一(没有用-窗口出现并立即消失的相同行为)
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 Beta中,有人能做到这一点吗?
谢谢
编辑
在问这个问题与发布iOS 13最终版本之间已经过去了一段时间。下面有很多答案,但是几乎所有答案都包含一件事- 向UIWindow添加更强/更强的引用 。您可能需要包括一些与新场景有关的代码,但是请尝试先添加强引用。
在升级适用于iOS 13场景模式的代码时,我遇到了同样的问题。使用第二部分代码的一部分,我设法修复了所有内容,因此我的窗口再次出现。除了最后一行,我和你一样。尝试删除viewController.present(...)。这是我的代码:
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(...),因为您显示带有该控制器的窗口并立即显示一些“自我”,所以这取决于“自我”的真正含义。
还值得一提的是,我存储了对从控制器内部移动的窗口的引用。如果这仍然对您没用,我只能显示使用此代码的小型仓库。看看里面AnyPopupController.swift和Popup.swift文件。
AnyPopupController.swift
Popup.swift
希望有帮助,@ SirOz