SwiftUI iOS14 Widget-使用相同的WidgetFamily创建创建多重布局

问题描述

从主屏幕添加小部件时,我可以看到Apple创建的Clock应用程序具有两个小的WidgetFamily布局。

如何在Clock应用程序中制作两个小控件?

我看到我只能为每个WidgetFamily创建一个布局。

解决方法

似乎您需要使用各自的视图,条目,提供者来创建单独的小部件...

以下是使用WidgetBundle的解决方案:

  1. 创建单独的小部件(确保@main注释未附加到任何小部件):
struct Widget1: Widget {
    let kind: String = "Widget1"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind,provider: Widget1Provider()) { entry in
            Widget1Entry(entry: entry)
        }
        .configurationDisplayName("Widget1")
        .description("This is an example widget v1.")
    }
}

struct Widget2: Widget {
    let kind: String = "Widget2"

    var body: some WidgetConfiguration {
        ...
    }
}

...
  1. 为每个小部件创建自己的视图(可能还根据需要将单独的条目和提供者):
struct Widget1EntryView: View {
    var entry: Widget1Entry

    var body: some View {
        Text("Widget1")
    }
}

struct Widget2EntryView: View {
    var entry: Widget2Entry

    var body: some View {
        Text("Widget2")
    }
}

...
  1. 使用WidgetBundle提供包含小部件的捆绑包
@main
struct WidgetsBudle: WidgetBundle {
    var body: some Widget {
        Widget1()
        Widget2()
        // add more Widgets if you want
    }
}

请注意,@main附加到WidgetsBudle而不是窗口小部件。