【问题标题】:Updating or refreshing a Swift Widget for an IOS Quote App更新或刷新 IOS 报价应用程序的 Swift 小部件
【发布时间】:2022-01-12 23:04:26
【问题描述】:

总结:我正在尝试实现我的第一个小部件。我的小部件连接到我的 Quote Swift 应用程序,我从中提取数据/报价以通过我的小部件显示。我能够成功同步我的小部件和我的应用程序。这意味着我可以在小部件上看到报价,当我单击小部件时,它会打开我的应用程序。

问题:很遗憾,我的小部件没有自行更新。它仅在我单击小部件时更新。

问题:我可以对我的代码进行哪些更改以允许我的小部件每小时或至少每天刷新一次?

这是我的代码:

import WidgetKit
import SwiftUI
import Intents

struct Provider: IntentTimelineProvider {
    func placeholder(in context: Context) -> SimpleEntry {
        SimpleEntry(date: Date(), text: "UpLifted", configuration: ConfigurationIntent())
    }

    func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {
        let entry = SimpleEntry(date: Date(), text: "UpLifted", configuration: configuration)
        completion(entry)
    }

    func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        var entries: [SimpleEntry] = []
        let userDefaults = UserDefaults(suiteName: "group.QuotePackage") 
        let text = userDefaults?.value(forKey: "text") as? String ?? "No Text"
        WidgetCenter.shared.reloadAllTimelines()
        
        let currentDate = Date()
       for hourOffset in 0 ..< 2 {
           let entryDate = Calendar.current.date(byAdding: .minute, value: hourOffset, to: currentDate)!
            let entry = SimpleEntry( date: entryDate, text: text, configuration: configuration)
            entries.append(entry)
            
        }
let timeline = Timeline(entries: entries, policy: .atEnd)
                completion(timeline)
    }
}

struct SimpleEntry: TimelineEntry {
   public let date: Date
   public let text: String
    public let configuration: ConfigurationIntent
}



struct QuoteWidgetEntryView : View {
    var entry: Provider.Entry
  
    var body: some View {
        ZStack {
            Image("background")
                .resizable()
                .aspectRatio(contentMode: .fill)
        
            Text(entry.text)
                .font(Font.custom("Georgia", size: 20))
                .fontWeight(.light)
                .foregroundColor(Color.white)
                .multilineTextAlignment(.center)
                .lineLimit(6)
        }
    }
}

@main
struct QuoteWidget: Widget {
    public var body: some WidgetConfiguration {
        IntentConfiguration(kind: "QuoteWidget",
                                   intent: ConfigurationIntent.self,
                                   provider: Provider()) { entry in
                   QuoteWidgetEntryView(entry: entry)
               }
               .configurationDisplayName("UpLifted Quotes")
               .description("Get a dose of inspiration")
           }
        }

struct QuoteWidget_Previews: PreviewProvider {
    static var previews: some View {
        Group {
        QuoteWidgetEntryView(entry: SimpleEntry(
            date: Date(),
            text: "UpLifted",
            configuration: ConfigurationIntent()))
            .previewContext(WidgetPreviewContext(family: .systemMedium))
            
            
        }
    }
}

【问题讨论】:

标签: swift xcode swiftui widget refresh


【解决方案1】:

你的时间线可能是这样的

func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        let currentDate = Date()
        let entryDate = Calendar.current.date(byAdding: .minute, value: 60, to: currentDate)!
        let userDefaults = UserDefaults(suiteName: "group.QuotePackage") 
        let text = userDefaults?.value(forKey: "text") as? String ?? "No Text"
        let entry = SimpleEntry( date: entryDate, text: text, configuration: configuration)
        let timeline = Timeline(entries: [entry], policy: .after(entryDate))
        completion(timeline)
    
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2015-05-10
    • 2021-01-15
    • 1970-01-01
    • 2016-05-28
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多