概述
场景概述
我将解释场景。请参阅官方文档以了解确切的详细信息。
场景是用于显示应用程序UI的窗口。可以在iPad上同时拆分和显示多个应用程序,但是不能同时显示同一应用程序。在iOS 13中可以实现。此时,划分的屏幕之一对应于场景。多次显示同一个应用程序时,内部仅作为一个应用程序启动一个进程,但是会生成多个Scene对象,并且用户可以为每个屏幕进行独立的屏幕转换,这是一种可以使用的机制。
我写了
窗口,但这是一个描述性的概念,而不是
Info.plist场景清单
如果使用
Xcode11创建新项目或操作应用程序目标
启动应用
以前,在应用程序启动时,填充
1 | optional func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool |
和
1 | optional func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool |
被调用。此部分在iOS13中相同。可以在此处完成应用程序流程级别的生命周期处理。
此外,如果将情节提要设置为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool { let window = UIWindow(frame: UIScreen.main.bounds) self.window = window window.makeKeyAndVisible() let vc = ViewController() window.rootViewController = vc return true } } |
在上面的代码中,通过在
但是,从iOS13开始,启用场景支持时将忽略这些过程。指定为
场景配置
启动
场景时,
来指定。
1 | optional func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration |
用
指定。根据作为参数给出的
配置的类型为
使用
Xcode11创建新项目时,默认情况下将
可以同时设置
委托方法和
在处理多个配置时,最好在
配置重载
使用
如果没有
我认为机会不多,但是在使用"场景配置"时可能需要小心。
发射场景
决定
配置后,iOS将基于该场景生成一个场景。当场景开始时,
1 | optional func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) |
被调用。此处连接的委托对象是在配置中指定的类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let scene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: scene) self.window = window window.makeKeyAndVisible() let vc = ViewController() window.rootViewController = vc } } |
首先,在开头检查
场景重用?
根据
模板代码注释中的
如果
先前的iOS支持
如果使用从
模板新创建的项目按原样将Deployment Target降低到iOS 12,则会经常发生编译错误。作为对此的简单响应,似乎可以做以下两点。
将@available 添加到SceneDelegate 。
1 2 3 4 | @available(iOS 13.0, *) class SceneDelegate: UIResponder, UIWindowSceneDelegate { // 略 } |
将@available 添加到AppDelegate 的application(:configurationForConnecting:options:) 中。
1 2 3 4 5 6 7 8 9 10 | class AppDelegate: UIResponder, UIApplicationDelegate { // 略 @available(iOS 13.0, *) func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // 略 } } |
并且在使用Storyboard时,对于iOS12或更早版本,设置
使用
代码进行构建时,对于iOS12或更早版本,必须在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool { if #available(iOS 13, *) { } else { let window = UIWindow(frame: UIScreen.main.bounds) self.window = window window.makeKeyAndVisible() let vc = ViewController() window.rootViewController = vc } return true } } @available(iOS 13.0, *) class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let scene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: scene) self.window = window window.makeKeyAndVisible() let vc = ViewController() window.rootViewController = vc } } |
适当总结常用部分是一个好主意。如上所述,即使在iOS 13中也可能无法启用Scene,因此仅靠版本判断是不够的,但是它会很复杂,并且您不知道Scene有效性判断的确切部分,因此您不必这样做。此外,如果您不介意浪费大量产生