iOS13更新之后增加了SceneDelegate文件,AppDelegate不再负责UI的生命周期,交给了SceneDelegate来处理,因此,我们创建根控制器的时候,就要在SceneDelegate文件中创建了,如下:
swift:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let windowScene = (scene as? UIWindowScene) else { return }
let vc = MainViewController()
let nav = UINavigationController(rootViewController: vc)
nav.view.backgroundColor = UIColor.white
// Create the window. Be sure to use this initializer and not the frame one.
window = UIWindow(windowScene: windowScene)
window?.rootViewController = nav
window?.makeKeyAndVisible()
}
OC:
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
UIWindowScene *windowScene = (UIWindowScene *)scene;
self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
self.window.frame = windowScene.coordinateSpace.bounds;
UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:[[MainViewController alloc] init]];
nav.view.backgroundColor = UIColor.whiteColor;
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
}
以上是保留scene多场景的情况,如果你的APP不需要多场景,直接在AppDelegate.swift里创建window,在didFinishLaunchingWithOptions里创建启动控制器、注释掉下面的两个与scene有关的代理方法,SceneDelegate.swift可以删除,也可以不管他,info.plist文件中删除Application Scene Manifest选项,做完以上操作,就可以和之前一样了。
AppDelegate.swift文件就会如下,变成我们熟悉的样子:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.backgroundColor = UIColor.white
self.window?.rootViewController = UINavigationController(rootViewController: MainViewController())
self.window?.makeKeyAndVisible()
return true
}
// MARK: UISceneSession Lifecycle
// @available(iOS 13.0, *)
// func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// // Called when a new scene session is being created.
// // Use this method to select a configuration to create the new scene with.
// return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
// }
//
// @available(iOS 13.0, *)
// func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// // Called when the user discards a scene session.
// // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
// }
}