最近,我在堆栈溢出中遇到了一个问题,我已经发布了这里。显然,这个错误是因为使用了一个随机的UIWindow变量来显示UI (而不是SceneDelegate中的那个)。
我的理解是--每次创建场景(由用户或应用程序创建)时,都会创建一个UISceneSession来管理一个UIScene,它可以包含一个或多个UIWindows,每个UIWindows都有视图,这些视图在视图控制器的帮助下显示。每个UIScene都将获得一个UISceneDelegate对象来处理其生命周期。
现在,我的以前的职位中的错误是有意义的--因为使用的是随机UIWindow对象,而不是SceneDelegate中的对象。
但我仍然不完全理解为什么UIWindow是由Xcode在SceneDelegate中声明的。在UIWindow中有一个UIWindowSceneDelegate对象(当前SceneDelegate的超类),文档清楚地解释了它是一个与场景相关的窗口。为什么没有使用它,而是在创建项目时由Xcode创建一个新变量?如果我需要另一个窗口,那么我可以将另一个UIWindow对象添加到当前的SceneDelegate中吗?这是个很好的做法吗?
@available (iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
// Remaining methods
}我是新的快速和iOS应用程序开发-任何帮助填补这些空白将不胜感激。
发布于 2022-10-17 13:34:49
UIWindowSceneDelegate不是场景委托的超类。这是一项协议。这不是真正的事情。这仅仅是一组指令,告诉编译器采用这个协议意味着什么。您的SceneDelegate类确实采用了UIWindowSceneDelegate协议。因此,它必须声明一个类型为window的UIWindow?属性,并且它这样做了。
此外,该属性是场景委托的窗口;没有它,您将没有窗口,屏幕将是黑色的。实际上,您可以将此属性设置为您自己创建的窗口;但您不必这样做,因此您可能不会费心。您不必这样做,因为框架会自动为您完成场景创建过程的一部分。
https://stackoverflow.com/questions/74098011
复制相似问题