1、问题及原因
1.1、问题
在升级到Xcode11及之后的版本,新建工程,直接给ViewController
设置颜色或者直接运行,发现并不会执行ViewController
当中的代码。
1.2、造成上述问题的原因
Xcode11与之对应的是ios13系统。
在我们更新到Xcode11与其之后的版本中,新建工程时我们会发现多出一个SceneDelegate
类,这是iPadOS用于支持多窗口。
在iOS13之前Appdelegate
全权管理App生命周期和UI生命周期。而iOS13之后,UI生命周期变成由SceneDelegate
负责,而Appdelegate
负责APP生命周期和SceneDelegate
的生命周期。
2、解决方法
根据我们项目是否需要支持多窗口,我们可以分为一下两种解决方案。
2.1、方案一(不支持多窗口)
- 第一步,先将项目中的
Info.plist
文件中的Application Scene Manifest
选项删除,然后删除SceneDelegate .h
和SceneDelegate.m
文件(这两个文件删不删除没什么影响)。 - 第二步,在
AppDelegate .h
文件中添加@property (nonatomic , strong) UIWindow *window;
,然后在AppDelegate.m
文件中的application: didFinishLaunchingWithOptions:
方法中进行window的相关设置(Xcode11之前相应的设置)。 - 第三步,将
AppDelegate.m
中一下代码删除或者注释掉。
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
// 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.
}
2.2、方案二(支持多窗口)
- 第一步,在
SceneDelegate.m
文件中进行window相应的设置(类似如下)。
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene *)scene];
self.window.backgroundColor = UIColor.whiteColor;
[self.window makeKeyAndVisible];
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
}
- 第二步,完成上述操作只能保证项目在iOS13及之后能够正常运行,但iOS13一下还是不能正常运行的,所以我们还要进行iOS13一下系统的适配,首先在
AppDelegate .h
文件中添加@property (nonatomic , strong) UIWindow *window;
,然后进行如下的判断和相应设置。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// @available(iOS 13.0,*)表示iOS 13.0及以上的系统,后面的*表示所有平台
if (@available(iOS 13.0,*)) {
}else{
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = UIColor.whiteColor;
[self.window makeKeyAndVisible];
ViewController *vc = [ViewController new];
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:vc];
}
return YES;
}