美文网首页
Xcode11 通过代码的方式来进入程序闪退或黑屏

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

作者: 一个半吊子工程师 | 来源:发表于2019-12-14 18:40 被阅读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 {

}

相关文章

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

    如下图所示: 通过Xcode11创建的工程除了有AppDelegate这个类文件,还多出来一个SceneDeleg...

  • Xcode11 创建的项目运行闪退或黑屏怎么解决?

    1. 问题及原因 1.1 问题 首先声明一下这里说的问题是针对通过代码的方式来进入程序而不是通过Storyboar...

  • 友盟错误统计分析

    代码中植入友盟错误统计,在程序闪退之后,能获取闪退报告,对于线上产品的闪退分析还是很必要的。在拿到错误分析之后,还...

  • 关于xcode11(持续更新)

    升级到xcode11后,出现了很多莫名其妙的bug。 1、pod install 后xcode闪退 2、代码一片黑...

  • Scrum(十五)小组DOD的建立

    小组DOD 所有代码通过eslint静态代码检测; 所有代码的提交需要通过人工审核; A类bug(系统崩溃、闪退等...

  • 代码闪退

    方法一:getchar() 即在主函数尾部或程序最后加上getchar(); 也就是接受键盘输入,这样程序就不会一...

  • swift5.x SnpKit 遇到的问题

    1、更新约束的时候出现了闪退 updateConstraints原代码 更新代码 闪退的提示信息说是找不到约束,这...

  • Android-避免App启动黑白屏闪现的2种方式

    App每次启动程序都会闪一下黑屏或白屏(取决于使用的全局样式),因为启动Activity的时候,需要执行完onCr...

  • OC 消息机制及转发

    问题: 运行如下代码程序会直接奔溃闪退,然后出现经常遇到的错误提示 unrecognized selector s...

  • 闪退问题

    造成闪退的原因有哪些呢? 1.打开的应用程序过多,iPhone内存容量用量超载导致程序闪退。 2.程序运行在较老的...

网友评论

      本文标题:Xcode11 通过代码的方式来进入程序闪退或黑屏

      本文链接:https://www.haomeiwen.com/subject/xmchnctx.html