swift reloadAllTimelines不适用于UserDefaults

oxf4rvwz  于 2022-12-17  发布在  Swift
关注(0)|答案(2)|浏览(177)

我的小工具从UserDefaults/ Appgroups加载一些数据,并根据这些数据显示一些文本和图片。这适用于第一次启动。如果我更改UserDefaults并使用WidgetCenter.shared.reloadAllTimelines(),它只会更改图片,而不会更改文本。
我能做些什么?主应用程序和小部件之间有其他共享数据的选项吗?似乎是一个bug。
这是我的小工具:

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, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        networkManager.fetchData { (post) in
 let entries = [ SimpleEntry(date: Date(), configuration: configuration, clubnamehome: post.home_name, 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, height: 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
                        
                    }
                    
                   
                    
                }
            }
            
            
        }

    }
rkue9o1l

rkue9o1l1#

看起来您从应用程序组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")
c8ib6hqw

c8ib6hqw2#

2022年12月11日 08:33:36 Resoled

  • 1.使用WidgetCenter.shared.reloadAllTimelines()
  • 2.使用UserDefaults(suiteName: "...")!.string(forKey: "xxx")只能在视图中使用,而不能在Widget或Widget Bundle中使用。
  • 3.完成(在应用前台重新加载后,WidgetKit立即重新加载。
    顺便说一句:WidgetCenter.shared.reloadTimelines(ofKind: "YourKind")也工作正常。

相关问题