`

(转)[IOS]xcode11建立swift项目会黑屏

    博客分类:
  • IOS
阅读更多

转自:https://www.jianshu.com/p/8659851b5e94

 

在Xcode 11 创建的工程,运行设备选择 iOS 13.0 以下的设备,运行应用时会出现黑屏现象。

原因:

  • Xcode 11 默认是会创建通过 UIScene 管理多个 UIWindow 的应用,工程中除了 AppDelegate 外会多一个 SceneDelegate
  • AppDelegate和SceneDelegate这是iPadOS带来的新的多窗口支持的结果,并且有效地将应用程序委托的工作分成两部分。
也就是说在我们用多窗口开发iPadOS中,从iOS 13开始,您的应用代表应该:
  • 设置应用程序期间所需的任何数据。
  • 响应任何专注于应用的事件,例如与您共享的文件。
  • 注册外部服务,例如推送通知。
  • 配置您的初始场景。

相比之下,在iOS 13中的新顶级对象是一个UIWindowScene,场景代表可以处理应用程序用户界面的一个实例。因此,如果用户创建了两个显示您的应用程序的窗口,则您有两个场景,均由同一个应用程序委托支持。
这些场景旨在彼此独立工作。因此,您的应用程序不再移动到后台,而是单个场景执行 - 用户可以将一个移动到后台,同时保持另一个打开。

适配方案一

如果我们不开发iPadOS多窗口APP,SceneDelegate窗口管理我们可以不需要直接删掉就好了。

 

  1. 删除掉info.plist中Application Scene Manifest选项,同时,文件SceneDelegate可删除可不删
  2. 相关代码注释掉

 

func application(_ application: UIApplication,  configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    }
    //注释掉这两个方法。

 3. Appdelegate新增windows属性

 

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    //如果是用默认的storyboard,下面的代码可以不写
//        window = UIWindow.init()
//        window?.frame = UIScreen.main.bounds
//        window?.makeKeyAndVisible()
//        window?.rootViewController = UIStoryboard.init(name: "Main", bundle: nil).instantiateInitialViewController()
        return true
    }
    ///做完这些就跟以前一样啦。

 

适配方案二

 

即要用iOS 13中新的SceneDelegate,又可以在iOS 13一下的设备中完美运行。那就添加版本判断,利用@available

SceneDelegate中添加@available(iOS 13, *)

import UIKit

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

......

 

AppDelegate中同样声明window属性,并把AppDelegate中两个关于Scene的类也添加版本控制,Swift中可以用扩展单独拎出来

 

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    ///didFinishLaunchingWithOptions中添加版本判断
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        if #available(iOS 13, *) {
          }else {
                window = UIWindow.init()
                window?.frame = UIScreen.main.bounds
                window?.makeKeyAndVisible()
                window?.rootViewController = UIStoryboard.init(name: "Main", bundle: nil).instantiateInitialViewController()
            }
            return true
        }
}

@available(iOS 13.0, *)
extension AppDelegate {
    // MARK: UISceneSession Lifecycle
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }
    
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    }
    
}

 

 

分享到:
评论

相关推荐

    iOS11 WKWebView 无法加载内容的解决方法

    这意味着,在 iOS 11 中,使用 NSMutableURLRequest 来加载网页将会失败。 解决方法 解决方法是使用 NSURLRequest 来代替 NSMutableURLRequest。下面是一个示例代码: ```swift if #available(iOS 11, *) { let ...

    ios 俄罗斯方块 黑屏源码

    描述简单明了,提到是"ios源代码,小游戏俄罗斯方块",暗示这是一个基于iOS平台的简单游戏项目,专注于实现经典的俄罗斯方块玩法。"黑屏运行,源码"则指出在尝试运行这个游戏时遇到了技术故障,源码的提供意味着问题...

    TestXcode11.zip

    当我们在Xcode 11中创建一个新的项目,它默认会包含一个Scene Delegate文件(SceneDelegate.swift),并使用Scene Delegate进行窗口管理。如果忽视了对老版本iOS的兼容性处理,那么在iOS 13以下系统上运行时,由于...

    KBSwiftUI:仅用来学习SwiftUI,一步一步的来

    KBSwiftUI仅用来学习SwiftUI,一步一步的来, 开始制作一些Demo 和一些功能环境必须工程 ... Xcode11 beta-3 +iOS : iOS13备注:由于Xcode Beta3 打开beta 版本工程时候,会黑屏状态,因此这里我重新构建V1版本

    vmware使用mac10.8记录

    2. 编程:使用Swift或Objective-C编写代码,利用Xcode的代码补全功能 3. 调试:使用内置调试器测试应用,查看变量状态 4. 构建与部署:通过Xcode将应用部署到模拟器或连接的iOS设备 #### 3.2.1 提示与技巧 - 使用...

    开闭电视动画效果

    在Xcode 5.0环境下,针对iOS 7.0及以上版本的设备,我们可以使用内置的Core Animation框架来实现这样的动画效果。 首先,我们需要了解`UIView`类中的几个关键方法,它们是实现视图过渡动画的基础。`...

Global site tag (gtag.js) - Google Analytics