如何在widgetkit swiftui中一次显示包含所有时间线条目的大型小部件?

问题描述

我有一个带有小部件的任务应用程序,它们都运行良好,但我想添加一个大型小部件,它可以一次显示许多任务(可能是 5 个),但是当从 Provider() 获取数据时,它只显示一个像其他小部件一样的时间。 在 getTimeline 和小部件代码下方。有人可以帮忙吗?

获取时间线:

func getTimeline(in context: Context,completion: @escaping (Timeline<Entry>) -> ()) {
        
        var entries: [WidgetContent] = []
        
        let viewContext = PersistenceController.shared.container.viewContext
        
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Task");
        
        let currentDate = Date()
        
        for hourOffset in 0 ..< 5 {
            
            let entryDate = Calendar.current.date(byAdding: .hour,value: hourOffset,to: currentDate)!
            
            var entry = snapshotEntry
            
            var results = [Task]()
            
            do { results = try viewContext.fetch(request) as! [Task] }
            
            catch let error as NSError { print("Could not fetch \(error),\(error.userInfo)") }
            
            let randomIndex = Int(arc4random_uniform(UInt32(results.count)))
            
            let displayComplete = results[randomIndex].isComplete
            let displayAdded = results[randomIndex].dateAdded
            let displayName = results[randomIndex].name
            let displayCategory = results[randomIndex].secondaryCategory
            let displayImportance = results[randomIndex].important
            let displayUrgency = results[randomIndex].urgent
            
            entry = WidgetContent(date: entryDate,isComplete: displayComplete,dateAdded: displayAdded!,name: displayName!,secondaryCategory: displayCategory!,important: displayImportance!,urgent: displayUrgency!)
            
            if !results[randomIndex].isComplete {
                
                entries.append(entry)
            }
        }
        let timeline = Timeline(entries: entries,policy: .atEnd)
        completion(timeline)
    }

小工具:

struct Important2DoMultipleWidget: Widget {
    let kind: String = "Important2DoMultipleWidget"
    
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind,provider: Provider()) { entry in
            DetailedEntryView(model: entry)
        }
        .configurationdisplayName("Important2Do Widget Detailed Version")
        .description("Find your important and urgent things.")
        .supportedFamilies([.systemLarge])
    }
}

显示的小部件(重要代码的一部分):

struct LargeDetailedEntryView: View {
    
    @Environment(\.widgetFamily) var family
    
    let model: [WidgetContent]
    
    var body: some View {
        
        vstack(spacing: 0) {
            ForEach(0 ..< model.count) { value in
                HStack(spacing: 5) {
                    vstack(alignment: .leading) {
                        Spacer()
                        HStack(alignment: .firstTextBaseline,spacing: 2) {
                            CategoryImageWidgetView(category: Category(rawValue: model[value].secondaryCategory)!)
                                .font(.footnote)
                                .padding(.all,5)
                                .foregroundColor(Category(rawValue: model[value].secondaryCategory)!.color)
                                .background(Category(rawValue: model[value].secondaryCategory)!.color.opacity(0.3))
                                .cornerRadius(12)
                            Text(model[value].secondaryCategory)
                                .font(.caption)
                                .foregroundColor(.primary)
                                .padding(.top,8)
                        }
                        Spacer()
...

上面的 model.count 始终只有 1 条记录,但它会正确更改时间线上每个条目显示的任务。 下面是关于它现在看起来如何的图片,作为一个常规小部件工作,我希望将多个任务放入同一个大小部件中。

Widget working with only one task

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)