如何在 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 之后,在范围内查找 BetterSheetCoordinatorBetterSheetSupport 时也会遇到一些问题(一旦我得到,我将标记为已接受的答案它工作)。我想使用这个包的原因是因为 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)中开启调试支持

SwiftUI项目如何在Xcode预览(Preview)中开启调试支持

Xcode 12.3 在 SwiftUI 项目启动时冻结