请求环境小部件系列时始终接收 .systemMedium

iOS*_*Dev 10 ios swift widgetkit

我试图在视图中获取正确的小部件系列,但我总是获得.systemMedium值。这是我的观点:

import SwiftUI

struct MyView: View
{
    @Environment(\.widgetFamily) var family

    let entry: MyEntry

    @ViewBuilder
    var body: some View
    {
        switch family
        {
        case .systemSmall:
           Text("systemSmall")
        case .systemMedium:
           Text("systemMedium")
        case .systemLarge:
           Text("systemLarge")
        case .systemExtraLarge:
           Text("systemExtraLarge")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么想法为什么会发生这种情况吗?谢谢。

Zol*_*tók 1

警示故事,请勿盲目复制以下代码!

对我来说,起初这种情况是在 Xcode 中的预览中发生的,所以我四处搜索并实现了这些扩展:

// DEBUG
extension WidgetFamily: EnvironmentKey {
    public static var defaultValue: WidgetFamily = .systemSmall
}

extension EnvironmentValues {
  var widgetFamily: WidgetFamily {
    get { self[WidgetFamily.self] }
    set { self[WidgetFamily.self] = newValue }
  }
}
Run Code Online (Sandbox Code Playgroud)

以及直接为预览指定家庭环境:

Group {
   SWidgetEntryView(entry: SimpleEntry(date: Date()))
     .previewContext(WidgetPreviewContext(family: .systemSmall))
     .environment(\.widgetFamily, .systemSmall)
   SWidgetEntryView(entry: SimpleEntry(date: Date()))
     .previewContext(WidgetPreviewContext(family: .systemMedium))
     .environment(\.widgetFamily, .systemMedium)
}
Run Code Online (Sandbox Code Playgroud)

这将解决预览期间的问题,但会弄乱设备上的小部件,因为它会覆盖widgetFamily环境变量。所有小部件尺寸都将具有您为 指定的不正确的系列环境defaultValue

如果您的设备上出现此类问题,您可能实现了类似的扩展来使预览正常工作。删除它可以解决设备上的问题。我不确定预览的正确修复是什么。