如何在 Xcode 12 的新 SwiftUI App 生命周期中更改 window.rootViewController?
Posted
技术标签:
【中文标题】如何在 Xcode 12 的新 SwiftUI App 生命周期中更改 window.rootViewController?【英文标题】:How can I change window.rootViewController in Xcode 12's new SwiftUI App lifecycle? 【发布时间】:2020-10-17 00:54:00 【问题描述】:我是 SwiftUI 的新手。我有一个新项目Test
,运行 SwiftUI 界面和 SwiftUI App 生命周期。这个生命周期对于 ios 14 和 Xcode 12 来说是新的。
我想在我的项目中使用 Github 包 BetterSheet。我已经添加了包依赖项。但是,如Basic Usage section of the readme 中所述,我必须使用SceneDelegate.swift
中的工作表支持来初始化UIHostingController
,如下所示:
window.rootViewController = UIHostingController.withBetterSheetSupport(rootView: ContentView())
由于新生命周期的性质,我的应用没有 SceneDelegate.swift
。我有 TestApp.swift
代替:
@main
struct TestApp: App
var body: some Scene
WindowGroup
ContentView()
我想在我的项目中使用 BetterSheet 包,但第一步似乎妨碍了我。我该如何解决这个问题?
【问题讨论】:
创建一个使用 SceneDelegate 的新项目。 回应您的评论,这似乎是最好的做法。新的 SwiftUI 生命周期太新了,目前缺少文档。 我不会说缺少文档,更多的是开发人员坚持希望将 UIKit 范例用于 SwiftUI 应用程序,而 Apple 显然正试图做相反的事情。 【参考方案1】:我怀疑你可以做这样的事情,based on their UIHostingController+BetterSheet.swift 代码。
@main
struct TestApp: App
let coordinator = BetterSheetCoordinator()
var body: some Scene
WindowGroup
BetterSheetSupport(coordinator: coordinator)
ContentView()
但我会质疑这个图书馆的价值。带有标准库的 iOS 14 中的工作表演示工作得很好,而且库本身已经 14 个月没有更新了。
【讨论】:
感谢您的回答。我现在正在尽最大努力实现这一点,但是即使在重新启动 Xcode 并导入BetterSheet
之后,在范围内查找 BetterSheetCoordinator
和 BetterSheetSupport
时也会遇到一些问题(一旦我得到,我将标记为已接受的答案它工作)。我想使用这个包的原因是因为 SwiftUI 的 Sheet
视图可以通过滑动手势移动/关闭,而我试图拥有一个无法移动的工作表视图。
您可能正在寻找fullScreenCover()
而有问题的类型可能是库内部的,所以如果不将代码方向导入项目,您可能无法做到这一点。
我将使用 fullScreenCover()。你是对的,类型是库内部的。
BetterSheet
附加一个 UIViewControllerRepresentable
结构以启用下拉以关闭回调,这在 SwiftUI 工作表中是不可能的以上是关于如何在 Xcode 12 的新 SwiftUI App 生命周期中更改 window.rootViewController?的主要内容,如果未能解决你的问题,请参考以下文章
不知道如何在 SwiftUI (Xcode 12.4) 中打开地图
Xcode 12.0 12A7209 SwiftUI 错误:编译器无法在合理的时间内对该表达式进行类型检查
如何在 XCode 中生成 iOS 13 SwiftUI 项目?
SwiftUI项目如何在Xcode预览(Preview)中开启调试支持