Xcode11 通过代码的方式来进入程序闪退或黑屏

2019-12-14  本文已影响0人  一个半吊子工程师

如下图所示:


WeChate1204a034f6cb8731a2b297180935f8d.png image

通过Xcode11创建的工程除了有AppDelegate这个类文件,还多出来一个SceneDelegate类文件。多出来的这个类时用来干嘛的呢?这是iPadOS带来的用来支持多窗口的。
在iOS13之前,Appdelegate的职责全权处理App生命周期和UI生命周期。而在iOS 13之后就发生了变化,UI生命周期变成由SceneDelegate来负责,而Appdelegate负责APP的生命周期和SceneDelegate的生命周期。所以还是像之前那么处理的话就会出问题。

解决方案

1、有多窗口开发相关的需求

不采用Storyboard的方式来启动,先删掉项目中Main.storyboard文件,然后打开项目的Info.plist文件,删掉下图用红色框起来的两项。

image
然后在SceneDelegate.m文件的scene: willConnectToSession: options:方法中设置windowrootViewController,代码如下所示:
- (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]];
}

这样程序就可以在iOS 13的设备中正常运行了,但是再iOS 13以下的设备上运行会黑屏,所以还需要适配iOS 13以下的系统。首先在AppDelegate .h文件中添加@property (nonatomic , strong) UIWindow *window;,然后将AppDelegate.m文件中的application: didFinishLaunchingWithOptions:方法的实现改为下面的代码。这样就可以在所有系统上都能正常运行了。

- (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;
}

2、没有多窗口开发相关的需求

第一步
先将项目的Info.plist文件中的Application Scene Manifest这一项删掉,然后删掉SceneDelegate .hSceneDelegate.m文件(这两个文件不删也不会有影响)。

第二步
AppDelegate .h文件中添加

@property (nonatomic , strong) UIWindow *window;

然后将AppDelegate.m文件中的application: didFinishLaunchingWithOptions:方法的实现改为下面的代码。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
    self.window.backgroundColor = UIColor.whiteColor;
    [self.window makeKeyAndVisible];
    
    self.window.rootViewController = [ViewController new];
    
    return YES;
}

第三步
经过前面2步操作后运行程序不会闪退了,但是发现黑屏,还需要将AppDelegate.m中的下面2个方法删掉。这样就可以正常启动程序了。

#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {

    return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}


- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {

}
上一篇 下一篇

猜你喜欢

热点阅读