Swift PreviewProvider在小部件扩展中不工作

Swift PreviewProvider在小部件扩展中不工作,swift,swiftui,widgetkit,Swift,Swiftui,Widgetkit,我有这个看法 import SwiftUI struct CurrentOrderView: View { let order: CurrentOrder var body: some View { VStack(alignment: .leading, spacing: 4) { HStack { Text("Order:") Text(order.orderId) } HStack

我有这个看法

import SwiftUI

struct CurrentOrderView: View {
  let order: CurrentOrder

  var body: some View {
    VStack(alignment: .leading, spacing: 4) {
      HStack {
        Text("Order:")
        Text(order.orderId)
      }

      HStack {
        Image(uiImage: deliveryImage)
          .resizable()
          .aspectRatio(contentMode: .fit)
          .frame(width: 50.0, height: 50.0)
        Text(order.formattedDeliveryTimeString)
      }
    }
    .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading)
    .padding()
    .background(LinearGradient(gradient: Gradient(colors: [.orange, .yellow]), startPoint: .top, endPoint: .bottom))
  }
}

// MARK: - Private

private extension CurrentOrderView {
  private var deliveryImage: UIImage {
    switch order.status {
    case .driverOnTheWayToRestaurant:
      return UIImage(named: "pin-restaurant") ?? UIImage()
    case .driverOnTheWayToUser:
      return UIImage(named: "rider") ?? UIImage()
    }
  }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    Group {
      CurrentOrderView(
        order: CurrentOrderEntryPlaceholderBuilder()
          .entry(with: .snapshot).order
      )
      .previewLayout(.fixed(width: 200, height: 100))
    }
  }
}
#endif
在画布上,我看到:

将previewContext添加到PreviewProvider

将previewContext添加到PreviewProvider

使用WidgetPreviewContext代替previewLayout

以下内容将为中型小部件添加预览。systemMedium也可以是.systemSmall和.systemLarge

如果调试 结构内容视图\u预览:PreviewProvider{ 静态var预览:一些视图{ 团体{ CurrentOrderView 订单:CurrentOrderEntryPlaceholderBuilder .entrywith:.snapshot.order .previewContextWidgetPreviewContextfamily:.systemMedium } } } 恩迪夫 使用WidgetPreviewContext代替previewLayout

以下内容将为中型小部件添加预览。systemMedium也可以是.systemSmall和.systemLarge

如果调试 结构内容视图\u预览:PreviewProvider{ 静态var预览:一些视图{ 团体{ CurrentOrderView 订单:CurrentOrderEntryPlaceholderBuilder .entrywith:.snapshot.order .previewContextWidgetPreviewContextfamily:.systemMedium } } } 恩迪夫
看起来您不想预览小部件,只想预览视图

您可以做的是将CurrentOrderView及其条目移动到另一个文件中

然后将此文件添加到除小部件目标之外的主应用程序目标

还要确保重命名previews struct,使其名称不同于自动生成的ContentView\u预览

这样,您的预览将按预期工作:

struct CurrentOrderView_Previews: PreviewProvider {
  static var previews: some View {
    Group {
      CurrentOrderView(
        order: CurrentOrderEntryPlaceholderBuilder()
          .entry(with: .snapshot).order
      )
      .previewLayout(.fixed(width: 200, height: 100))
    }
  }
}

看起来您不想预览小部件,只想预览视图

您可以做的是将CurrentOrderView及其条目移动到另一个文件中

然后将此文件添加到除小部件目标之外的主应用程序目标

还要确保重命名previews struct,使其名称不同于自动生成的ContentView\u预览

这样,您的预览将按预期工作:

struct CurrentOrderView_Previews: PreviewProvider {
  static var previews: some View {
    Group {
      CurrentOrderView(
        order: CurrentOrderEntryPlaceholderBuilder()
          .entry(with: .snapshot).order
      )
      .previewLayout(.fixed(width: 200, height: 100))
    }
  }
}

但我不希望这个视图是完整的小部件大小,实际上它只占小部件的50%,我该怎么办?我不明白@PaulT的意思。我的意思是,在我的情况下,CurrentOrderView应该占小部件宽度的50%,因为小部件由CurrentOrderView+另一个视图组成。但使用您的代码,它以100%显示CurrentOrderViewwidth@PaulT. 我在你的问题中只看到一个视图我理解,但这就是为什么我在问题中手动设置大小,但我不希望这个视图是完整的小部件大小,实际上它只占小部件的50%,我该怎么办?我不明白你说的@PaulT是什么意思。我的意思是,在我的情况下,CurrentOrderView应该占据小部件宽度的50%,因为小部件由CurrentOrderView+另一个视图组成。但使用您的代码,它以100%显示CurrentOrderViewwidth@PaulT. 我在你的问题中只看到一个视图我明白,但这就是为什么我在问题中手动设置大小,但我不希望这个视图是完整的小部件大小,实际上它只占小部件的50%,我应该怎么做?但我不希望这个视图是完整的小部件大小,实际上它只占小部件的50%,我应该怎么做?这是有希望的,但是它不起作用。你可以尝试更改ContentView\u预览的名称吗?这很有希望,但它不起作用。你可以尝试更改ContentView\u预览的名称吗?