最近,我在stackoverflow中遇到了一个问题,我已经在这里发布了这个问题。显然,错误是因为使用了一个随机的UIWindow变量来显示UI(而不是SceneDelegate中的那个(。
我的理解是——每次(用户或应用程序(创建场景时,都会创建一个UISceneSession来管理UIScene,它可以包含一个或多个UIWindows,每个UIWindows都有视图,这些视图在视图控制器的帮助下显示。每个UIScene都将获得一个UISceneDelegate对象来处理其生命周期。
我上一篇文章中的错误现在有意义了——因为使用了一个随机的UIWindow对象,而不是SceneDelegate中的对象。
但我仍然不完全理解为什么Xcode在SceneDelegate中声明了UIWindow。UIWindowSceneDelegate中有一个UIWindow对象(我当前SceneDeligate的超级类(,文档清楚地解释了这是一个与场景相关的窗口。为什么不使用它,而是在创建项目时由Xcode创建一个新变量?如果我需要另一个窗口,那么我可以向当前SceneDelegate添加另一个UIWindow对象吗?这是个好做法吗?
@available (iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
// Remaining methods
}
我是swift和iOS应用程序开发的新手,如果能帮助我填补这些空白,我将不胜感激。
UIWindowSceneDelegate不是场景代理的超类。这是一个协议。这不是一件真实的事情。它只是一组指令,告诉编译器采用此协议意味着什么。您的SceneDelegate类确实采用UIWindowSceneDeligate协议。因此,它必须声明类型为UIWindow?
的window
属性,并且它会这样做
此外,此属性是场景代理的窗口;如果没有它,你将没有窗口,屏幕将是黑色的。事实上,可以将此属性设置为您自己创建的窗口;但你不必这么做,所以你可能不会麻烦。您不必这样做,因为作为场景创建过程的一部分,框架会自动为您执行此操作。