【问题标题】:Xcode 12, Swift 5.3: @Environment(\.colorScheme) Not UpdatingXcode 12、Swift 5.3:@Environment(\.colorScheme) 未更新
【发布时间】:2021-03-05 13:58:37
【问题描述】:

我正在尝试在我的内置 SwiftUI、Xcode 12 和 iOS14 的应用中实现阅读暗模式。

我正在使用此键来查找它是否处于明暗模式:@Environment(\.colorScheme) var colorScheme

我的测试设备设置为暗模式,但环境变量是阅读亮模式。

我已经对删除应用程序、重新加载 XCode 并重新启动我的 Macbook Pro 进行了测试。

User Interface Style 未使用,因为这是 iOS14。 (SwiftUI: Dark mode not detected when testing on device)

奇怪的是,我的测试设备(iPhone 11 Pro)将非背景颜色的视图渲染得尽可能深。所以唯一没有更新的是变量 colorScheme 本身。我不会在我的应用程序的任何地方以编程方式更改该值。

我还检查了我的 info.plist 是否在目标的构建设置中正确路由。我正在使用主应用程序的目标,以及小部件扩展的目标。

我错过了什么?

【问题讨论】:

  • .colorScheme 读取系统外观,您为什么期望它对更改的 Info.plist 做出反应?
  • @Asperi 我希望它在 Info.plist 中设置为 Dark 时读取 Dark。每stackoverflow.com/questions/56537855/… - 显然我误解了这种用法。
  • 编辑问题以反映这种理解

标签: swift swiftui


【解决方案1】:

在我的项目中,我发现@Environment(\.colorScheme) var colorScheme获取的是你软件的配色方案,而不是系统的配色方案。

所以当你手动更改软件本身的配色方案时,@Environment(\.colorScheme) var colorScheme你就无法再次获取手机的配色方案了。

改用下面的代码,它会给你手机的配色方案

let currentSystemScheme = UITraitCollection.current.userInterfaceStyle

需要注意的是userInterfaceStylecolorScheme不是同一个类型,所以可能需要下面的代码来转换

func schemeTransform(userInterfaceStyle:UIUserInterfaceStyle) -> ColorScheme {
    if userInterfaceStyle == .light {
        return .light
    }else if userInterfaceStyle == .dark {
        return .dark
    }
    return .light}

【讨论】:

  • 我使用了 ViewModel 和 UserDefault 组合来允许用户在保持颜色模式和跟随系统之间切换。如果需要更详细的代码,可以回复我
【解决方案2】:

我才知道为什么?

我在应用生命周期的早期阅读@Environment(\.colorScheme) var colorScheme: ColorScheme

当我打开应用程序时,我会在应用程序完成初始化之前创建我的数据类。我在这个数据类中调用了@Environment(\.colorScheme) var colorScheme: ColorScheme

应用程序使用.onAppear() 完成初始化后,我在视图上使用@Environment(\.colorScheme) var colorScheme: ColorScheme 进行了测试,它可以正常工作??

【讨论】:

  • 另外,在@environmentobject 中使用@Environment(\.colorScheme) var colorScheme: ColorScheme 并不会改变我的测试。我不得不在视图中引用它并且它工作正常。
【解决方案3】:

我希望它在 Info.plist 中设置为 Dark 时显示为 Dark。每……

嗯...Apple 的文档说 枚举用户设置选项(请参阅下面的完整快照):

/// The possible types of color schemes, like Dark Mode.
///
/// The color scheme enumerates the user setting options for Light or Dark Mode.
/// It also provides the light or dark options for any particular view when the
/// app wants to override the user setting.
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public enum ColorScheme : CaseIterable {

    case light

    case dark

【讨论】:

  • 是的,我正在关注您,感谢您的评论。我更新了我原来的问题。问题是@Environment(\.colorScheme) var colorScheme: ColorScheme 没有更新到设备模式。我的测试设备处于暗模式,应用程序处于阅读模式。
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多