选择退出 iOS 上的 UISceneGenerate/SwiftUI

我现在使用的是 Xcode 11 Beta 5。在我的应用程序中,它在 iOS12及以下版本上运行良好。然而,在 iOS13上看起来默认使用的是 UIScene。这导致我的应用程序什么都不做。

当应用程序在新安装时启动时,用户必须接受一些条款和条件。在同意后,他们走到一个载入屏幕,然后指示他们的主要看法。在我发布的截图中,前景中当前视图后面的视图是启动加载屏幕。

我们很快就会考虑在整个应用程序中添加多视图场景支持,但是现在我们有更高优先级的东西需要处理。

“支持多个窗口”已经在应用程序的目标的常规设置中禁用。我还在 info.plist 文件中将 Enable Multi Windows 设置为 NO。

到目前为止,一切都没有真正奏效。基本上,我想退出/禁用多个窗口和 UIScene/SwiftUI 来恢复 iOS10-12的原始行为。这在 iOS13中可行吗? 还是我们必须更新它?

更新:

下面是视图调试层次结构的屏幕截图。左边是 iOS12,右边是 iOS13。既没有向 Info.plist 添加任何内容,也没有任何场景委托类或方法,为什么它会有所不同呢?基本上只是在 Xcode 11上的现有生产就绪代码中运行它。

62150 次浏览

这也是我曾经面临的问题,这里有几种情况:

  • 如果你想在 Xcode 11中开发一个 现有的 UIKit应用程序,只要打开它就可以了。我所有的应用程序都有,与 没有 SceneDelegate文件也没有任何变化的 AppDelegate或故事板。
  • 如果要创建 针对 iOS13的新 UIKIT应用程序,只需创建它,同时确保“ Use SwiftUI”复选框未选中。

但我想知道你是否正面临着第三种情况——一个我一周前做过的情况。创建 新的 UIKit 应用程序针对比 iOS13更早的东西。(实际上我的目标是 iOS9!)

是的,您的模板将提供15个错误(从 beta 5开始) ,以及一个 SceneDelegate文件/类。幸运的是,Xcode 将帮助您自动纠正除一个以外的所有错误。

最后一个是添加一行,这是 SceneDelegate类的一部分,但不幸的是,苹果没有把它放在 AppDelegate类中——在超过12个 @available(iOS 13.0, *)子句之后,这意味着如果运行 iOS 12,你已经选择了放弃 SceneDelegate,你猜怎么着?这是 没有ApDelegate

把这个添加到你的应用程序代表:

var window: UIWindow?

此时,您应该有一个针对 iOS12及更早版本的运行中的 UIKit应用程序。

当你的应用程序在 iOS13或更高版本下运行时,你可以在 应该中使用场景,当你仍然支持 iOS12或更高版本时,你可以完全退出。

  • 从 Info.plist 中完全删除“ Application Scene Manifest”条目。

  • 如果有一个场景委托类,删除它。

  • 如果在你的应用程序委托中有任何与场景相关的方法,删除这些方法。

  • 如果缺少,将属性 var window: UIWindow?添加到应用程序委托中。

您的应用程序现在应该只使用应用程序委托,在 iOS13下,它应该具有与 iOS12相同的生命周期。

注意: 这些都不是 Swift 或 SwiftUI 特有的。

好吧,我想通了。由于 iOS13的新默认卡片展示风格的变化,在我的故事板中,从我的启动画面到我的自定义流导航控制器,默认为新的展示(见下面的截图)。

Segue

我是如何修复这个问题的,就是回到旧的风格,默认为旧的生命周期。见下面的截图。

Storyboard seque kind

不知道为什么会这样,因为这是我的应用程序中唯一导致这种情况的地方(相当大的应用程序,所以我必须花一些时间通过所有的故事板来确保)。

我使用 dfd 的答案来实现这个功能,但是因为我的应用程序是在 Objective-C 中,所以我必须做一个更改:

在 Objective-C 中,您需要将

@property (strong, nonatomic) UIWindow *window;

H (不在. m 中)

Xcode 12-Swift 5.3-iOS 14

从 Xcode 12开始,在 Swift 5.3和 @main的帮助下,您可以拥有一个没有 SceneDelegate或事件 AppDelegate的多平台应用程序。只有一个简单的文件,比如:

import SwiftUI


@main
struct MyMultiPlatformApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}

当您希望选择不使用它时,有时阻止它找到场景委托文件的问题出现在 info.plist 文件中。

如果你有这个在 info.plist

Scene Configuration
Application Session Role
Item 0 (Default Configuration)
Delegate Class Name : SceneDelegate
Storyboard Name : Main

应该是的。

Scene Configuration
Application Session Role
Item 0 (Default Configuration)
Delegate Class Name : $(PRODUCT_MODULE_NAME).SceneDelegate
Storyboard Name : Main