ios - 是否可以在 iOS 14 WidgetKit 中动态更新/更改布局(例如 View 数量)?

标签 ios swiftui widgetkit

我正在开发我的第一个 iOS 14 WidgetKit 。我知道 WidgetKit 大多是静态的,无法显示动画等动态内容。但是是否可以更改 WidgetKit 中 View 的布局/数量?

由于我是 SwiftUI 的新手,所以我看不到任何更改 View 内容的方法。

上下文:

假设一个 ToDo 应用程序中的 WidgetKit 应显示最多 5 个条目的按钮/链接。但是,如果应用程序中当前只有 3 个条目,则 WidgetKit 当然应该只显示 3 个链接。

该应用程序已经提供了“今日 WidgetKit ”。在这里,我通过简单地将固定数量的条目(例如 5)的控件(按钮)添加到 WidgetKit View 来解决了这个问题。如果应显示较少的条目,则当 WidgetKit 更新其 View 时,未使用的控件将被隐藏。

在 SwiftUI 中创建具有固定数量条目(链接)的 WidgetKit View 没有问题。但如何隐藏/删除未使用的 View ?

在 SwiftUI 中, View 是一个 some View 变量,我没有看到动态更改其内容的方法:

struct MyEntryView: View {
    var body: some View {
        Hstrack {
            // Item 1

            // Item 2

            ...

            // Item n
        }
    }
}

最佳答案

WidgetKit View 是静态,但只要有新条目传递给它们,它们就会重绘

不可能创建一个在集合更改时自行更新的 Widget View 。

您可以:

  • 提前创建条目
  • 或者在检测到集合发生更改时强制刷新时间线

在这两种情况下,您都需要创建一个条目:

struct SimpleEntry: TimelineEntry {
    let date: Date
    let items: [String]
}

并在 View 中显示其项目:

struct SimpleWidgetEntryView: View {
    var entry: SimpleProvider.Entry

    var body: some View {
        VStack {
            ForEach(entry.items, id: \.self) {
                Text($0)
            }
        }
    }
}

唯一的区别在于创建条目的方式:

你可以:

  • 提前创建条目(条目的大小可能会有所不同):
func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) {
    var entries = [SimpleEntry]()

    let currentDate = Date()

    for offset in 0 ..< 5 {
        let entryDate = Calendar.current.date(byAdding: .minute, value: offset, to: currentDate)!
        entries.append(SimpleEntry(date: entryDate, items: Array(repeating: "Test", count: offset + 1)))
    }

    let timeline = Timeline(entries: entries, policy: .atEnd)
    completion(timeline)
}
  • 或者使用当前数据创建单个 Entry,并且每当数据发生变化时,通过调用刷新 Widget:
WidgetCenter.shared.reloadAllTimelines()

(重新加载时间线的频率可能有限制)。

关于ios - 是否可以在 iOS 14 WidgetKit 中动态更新/更改布局(例如 View 数量)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64158617/

相关文章:

swiftui - 如何将环境对象变量绑定(bind)到 slider

flutter - 如何防止 iOS 14 Widget 打开应用程序并对回调使用react

SwiftUI Widget DateStyle 自定义格式

iOS:仅更改 UIView 的外观(无子类)- 可能吗?

ios - popViewController Animated : from alertView:didDismissWithButtonIndex: 的断断续续的动画

ios - 之后列表不会在 swiftUI 中加载。更新

swiftui - 使用iOS 14 @main时的托管 Controller

swift - 如何在 WidgetKit 中重置意图扩展配置

ios - 下载 iOS 时流式传输视频

ios - 你能在 Storyboard中为自己定义一个 Segue 吗?