如何检查SwiftUI是否处于预览模式?

ryhaxcpt  于 2023-01-25  发布在  Swift
关注(0)|答案(4)|浏览(191)

是否有方法检查SwiftUI应用程序是否处于预览模式?例如,您可以使用#if DEBUG检查应用程序是否处于开发或生产模式。您是否可以执行类似的操作来检查是否正在预览?

ivqmmu1c

ivqmmu1c1#

您可以使用ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"]来检测此情况。在画布中运行时,该值将为"1"

8fsztsew

8fsztsew2#

如果您像我一样正在寻找一个环境变量,用于构建脚本,在构建SwiftUI预览时设置xcode,结果是ENABLE_PREVIEWS
当我的脚本更新Info.plist文件时,SwiftUI正在暂停预览。为了解决这个问题,如果我们处于预览版本中,我会在某个点退出脚本。

if [ "${ENABLE_PREVIEWS}" = "YES" ]; then
  exit 0;
fi
i2loujxw

i2loujxw3#

虽然目前没有编译标志可用于检查活动构建是否适用于预览画布,但如果可以满足您的需要,我仍然建议使用编译器指令而不是运行时检查。
例如,对于模拟器 * 和 * 预览,此检查解析为true:

#if targetEnvironment(simulator)
// Execute code only intended for the simulator or Previews
#endif

如果希望代码仅在物理设备上执行(如与相机相关的操作,否则肯定会失败),请对条件求反。
运行时检查你的代码是否在预览中执行(正如在可接受的答案中给出的)可能不会增加显著的性能开销,但是将代码以IMO形式发布仍然会让人感觉有点恶心。所以如果你的情况需要这种级别的特殊性,至少值得首先考虑。如果需要,我建议将代码 Package 在编译器检查中,以便从发布版本中删除它。

flvlnr44

flvlnr444#

如果您不想依赖ProccessInfo值,则始终可以在SwiftUI中设计自己的环境变量。

import SwiftUI

private struct IsPreviewKey: EnvironmentKey {
    static let defaultValue = false
}

extension EnvironmentValues {
    var isPreview: Bool {
        get { self[IsPreviewKey.self] }
        set { self[IsPreviewKey.self] = newValue }
    }
}

然后在创建预览时注入变量

MyView().environment(\.isPreview, true)

你可以在你的视图中这样使用它:

struct MyView: View {
    @Environment(\.isPreview) var isPreview
}

我通常有一个方法可以为预览生成所有不同的版本(亮模式,暗模式,iPad,iPhone,...),所以我把它注入到所有的预览中。

相关问题