简化 Xcode 中的 SwiftUI 预览

Ant*_*ton 5 xcode preview swiftui

我的应用程序通常运行很多代码,我想在预览中跳过它们。代码耗时且没有可见效果(例如初始化音频设备)。我正在尝试弄清楚如何跳过它进行预览。

\n\n

有一种简单的方法可以使用 DEBUG 宏仅在应用程序的生产版本中运行代码。但我不知道非预览版有什么类似的东西(因为预览版可能会构建与非预览版相同的代码)。

\n\n

我认为previewMode在我的 ViewModel 中设置一个变量 是可行的。这样我就可以只在 PreviewProvider 中将其设置为 true:

\n\n
struct MainView_Previews: PreviewProvider {\n\n    static var previews: some View {\n        let vm = ViewModel(previewMode: true)\n        return MainView(viewModel: vm)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我在 SceneDelegate 中创建 ViewModel 时,我可以设置previewModefalse

\n\n
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {\n\n    let vm = ViewModel(previewMode: false)\n    let mainView = MainView(viewModel: vm)\n\n    // Use a UIHostingController as window root view controller.\n    if let windowScene = scene as? UIWindowScene {\n        let window = UIWindow(windowScene: windowScene)\n        window.rootViewController = UIHostingController(rootView: mainView)\n        self.window = window\n        window.makeKeyAndVisible()\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样我就可以将任何我不想运行预览的代码包含在其中if !previewMode { \xe2\x80\xa2\xe2\x80\xa2\xe2\x80\xa2 }

\n\n

不幸的是代码仍在运行。显然,scene()每当我的预览更新时,就会调用该函数。:(

\n\n

如何指定不运行预览的代码?

\n\n

谢谢!

\n

Ant*_*ton 3

我发现的唯一可行的解​​决方案是使用ProcessInfo.processInfo.environmentkey 的值XCODE_RUNNING_FOR_PREVIEWS。仅当在预览模式下运行时才将其设置为“1”:

let previewMode: Bool = ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
Run Code Online (Sandbox Code Playgroud)

请参阅此帖子