Xcode11 新建OC 工程后,发生了很大的变化,发现多了两个文件夹。

%title插图%num

原因: Xcode自动新增了一个SceneDelegate文件, 也就是说在iOS13中Appdelegate的作用发生了改变: iOS13之前,Appdelegate的作用是全权处理App生命周期和UI生命周期; iOS13之后,Appdelegate的作用是只处理 App 生命周期, 而UI的生命周期将全权由新增的SceneDelegate来处理.

那怎么回到原来熟悉的方式尼:删除默认Main.storyBoard、自定义根控制器?

方法一:(推荐)在新增的 SceneDelegate文件中添加。先把下面框住的配置删除。

%title插图%num
初始化window方法不再在Appdelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions进行初始化, 而是在SceneDelegate中初始化了,如下:

– (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).

// 自定义根控制器
self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene *)scene];
UIViewController *rootVc = [[UIViewController alloc]init];
rootVc.view.backgroundColor = [UIColor purpleColor];
rootVc.title = @”scene”;
UINavigationController *rootNav = [[UINavigationController alloc]initWithRootViewController:rootVc];
[self.window setRootViewController:rootNav];
[self.window makeKeyAndVisible];

}

 

同样实现的我们自定义跟控制器。

方法二:将SceneDelegate 相关的全部删除。把系统自动生成的ViewController也一同删除。在AppDelegate.h 中加上
@interface AppDelegate : UIResponder <UIApplicationDelegate>

// 重新添加回来
@property (strong, nonatomic) UIWindow * window;

@end

 

didFinishLaunchingWithOptions 中方法中写我们熟悉的代码了。

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

// 1.创建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 设置UIWindow的背景颜色
self.window.backgroundColor = [UIColor whiteColor];

HomeViewController *homeVC = [HomeViewController new];
UINavigationController *homeNav = [[UINavigationController alloc] initWithRootViewController:homeVC];;

self.window.rootViewController = homeNav;

[self.window makeKeyAndVisible];

return YES;

}

记得把AppDelegate.m 下面 UISceneSession lifecycle的代码删除了, 就OK 了。可以把原来熟悉的生命周期的代理方法加回来。