reloadAllTimelines无法与UserDefaults一起使用

问题描述

“我的窗口小部件”从UserDefaults/ Appgroups加载一些数据,并根据它显示一些文本和图片。 这是从头开始的。 如果我更改UserDefaults并使用WidgetCenter.shared.reloadAllTimelines(),则仅更改图片而不更改文本。

我该怎么办?还有其他选项可以在主应用程序和小部件之间共享数据吗?似乎是一个错误

这是我的Widgetentry:

struct Provider: IntentTimelineProvider {
    
    let networkManager = NetworkManager()
    func placeholder(in context: Context) -> SimpleEntry {
        SimpleEntry(date: Date(),configuration: ConfigurationIntent(),clubnamehome: "test",clubnameaway: "test2")
    }
    
   func getSnapshot(for configuration: ConfigurationIntent,in context: Context,completion: @escaping (SimpleEntry) -> ()) {
        networkManager.fetchData { (post) in
      let entry = SimpleEntry(date: Date(),configuration: configuration,clubnamehome: post.home_name,clubnameaway: post.away_name)
                completion(entry)
            
        }
        
        
    }
    func getTimeline(for configuration: ConfigurationIntent,completion: @escaping (Timeline<Entry>) -> ()) {
        networkManager.fetchData { (post) in
 let entries = [ SimpleEntry(date: Date(),clubnameaway: post.away_name) ]
                 let reloadTime = Calendar.current.date(byAdding: .minute,value: 5,to: Date())!
                let timeline = Timeline(entries: entries,policy: .after(reloadTime))
                completion(timeline)
        }
    }
   
}

在这里我设置UserDefault的值:

@IBAction func losGehts(_ sender: UIButton) {
        
        switch team {
        case "arminia":
 UserDefaults(suiteName: "...")!.set("114",forKey: "tabellenId")
            
            
            if #available(iOS 14.0,*) {
                WidgetCenter.shared.reloadAllTimelines()
            } else {
                // Fallback on earlier versions
            }
            
        case "augsburg":

这是我的看法:

struct MyTeamWidgetEntryView : View {
    
    
    @Environment(\.colorScheme) var colorScheme
    var imageIcon = "stuttgart"
    var entry: Provider.Entry
    let logo = UserDefaults(suiteName: "...")!.string(forKey: "logo")
    let mannschaftsName = UserDefaults(suiteName: "...")!.string(forKey: "teamname")
    let teamID = "289"
    
    var body: some View {
        
        HStack {
            Spacer()
            vstack (alignment: .leading,spacing: 0) {
                Spacer().frame(height: 10)
                
                // image von hier
                
                HStack {
                    Spacer()
                    switch logo {
                    case "arminia":
                        Image("bundesliga1/arminia").resizable().aspectRatio(contentMode: .fit).frame(width: 25,height: 25,alignment: .bottomLeading)
                    case "augsburg":
                        Image("bundesliga1/augsburg").resizable().aspectRatio(contentMode: .fit).frame(width: 25,alignment: .bottomLeading)
                   
                    default:
                        Image("bundesliga1/...").resizable().aspectRatio(contentMode: .fit).frame(width: 90,height: 90,alignment: .center)
                    }
                    
                    Spacer()
                }
                
                // image bis hier
                Spacer().frame(height: 5)
            }
            Spacer()
            vstack (alignment: .leading,spacing: 6) {
                
                vstack {
                    HStack{
                        Text(entry.clubnamehome).font(.system(size: 10)).bold()
                        Text(":").font(.system(size: 10)).bold()
                        Text(entry.clubnameaway).font(.system(size: 10)).bold()
                        Spacer()
                        //überlegen ob spacer rein soll oder nicht
                        
                    }
                    
                   
                    
                }
            }
            
            
        }

    }

解决方法

您似乎从应用组UserDefaults中正确读取了logomannschaftsName值:

struct MyTeamWidgetEntryView : View {
    let logo = UserDefaults(suiteName: "...")!.string(forKey: "logo")
    let mannschaftsName = UserDefaults(suiteName: "...")!.string(forKey: "teamname")    

现在,您需要确保在主应用程序中正确设置了这些值。在您发布的代码中,您只能为tabellenId键设置一个值:

case "arminia":
    UserDefaults(suiteName: "...")!.set("114",forKey: "tabellenId")

您还需要更新logomannschaftsName

case "arminia":
    UserDefaults(suiteName: "...")!.set("114",forKey: "tabellenId")
    UserDefaults(suiteName: "...")!.set("???",forKey: "logo")
    UserDefaults(suiteName: "...")!.set("???",forKey: "mannschaftsName")

这可能是摘录的,所以您不要重复自己

switch team {
    ...
}

UserDefaults(suiteName: "...")!.set(team,forKey: "mannschaftsName")