是否有方法检查SwiftUI应用程序是否处于预览模式?例如,您可以使用#if DEBUG检查应用程序是否处于开发或生产模式。您是否可以执行类似的操作来检查是否正在预览?
#if DEBUG
ivqmmu1c1#
您可以使用ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"]来检测此情况。在画布中运行时,该值将为"1"。
ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"]
"1"
8fsztsew2#
如果您像我一样正在寻找一个环境变量,用于构建脚本,在构建SwiftUI预览时设置xcode,结果是ENABLE_PREVIEWS。当我的脚本更新Info.plist文件时,SwiftUI正在暂停预览。为了解决这个问题,如果我们处于预览版本中,我会在某个点退出脚本。
ENABLE_PREVIEWS
Info.plist
if [ "${ENABLE_PREVIEWS}" = "YES" ]; then exit 0; fi
i2loujxw3#
虽然目前没有编译标志可用于检查活动构建是否适用于预览画布,但如果可以满足您的需要,我仍然建议使用编译器指令而不是运行时检查。例如,对于模拟器 * 和 * 预览,此检查解析为true:
#if targetEnvironment(simulator) // Execute code only intended for the simulator or Previews #endif
如果希望代码仅在物理设备上执行(如与相机相关的操作,否则肯定会失败),请对条件求反。运行时检查你的代码是否在预览中执行(正如在可接受的答案中给出的)可能不会增加显著的性能开销,但是将代码以IMO形式发布仍然会让人感觉有点恶心。所以如果你的情况需要这种级别的特殊性,至少值得首先考虑。如果需要,我建议将代码 Package 在编译器检查中,以便从发布版本中删除它。
flvlnr444#
如果您不想依赖ProccessInfo值,则始终可以在SwiftUI中设计自己的环境变量。
ProccessInfo
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,...),所以我把它注入到所有的预览中。
4条答案
按热度按时间ivqmmu1c1#
您可以使用
ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"]
来检测此情况。在画布中运行时,该值将为"1"
。8fsztsew2#
如果您像我一样正在寻找一个环境变量,用于构建脚本,在构建SwiftUI预览时设置xcode,结果是
ENABLE_PREVIEWS
。当我的脚本更新
Info.plist
文件时,SwiftUI正在暂停预览。为了解决这个问题,如果我们处于预览版本中,我会在某个点退出脚本。i2loujxw3#
虽然目前没有编译标志可用于检查活动构建是否适用于预览画布,但如果可以满足您的需要,我仍然建议使用编译器指令而不是运行时检查。
例如,对于模拟器 * 和 * 预览,此检查解析为true:
如果希望代码仅在物理设备上执行(如与相机相关的操作,否则肯定会失败),请对条件求反。
运行时检查你的代码是否在预览中执行(正如在可接受的答案中给出的)可能不会增加显著的性能开销,但是将代码以IMO形式发布仍然会让人感觉有点恶心。所以如果你的情况需要这种级别的特殊性,至少值得首先考虑。如果需要,我建议将代码 Package 在编译器检查中,以便从发布版本中删除它。
flvlnr444#
如果您不想依赖
ProccessInfo
值,则始终可以在SwiftUI中设计自己的环境变量。然后在创建预览时注入变量
你可以在你的视图中这样使用它:
我通常有一个方法可以为预览生成所有不同的版本(亮模式,暗模式,iPad,iPhone,...),所以我把它注入到所有的预览中。