我的小工具从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
}
}
}
}
}
2条答案
按热度按时间rkue9o1l1#
看起来您从应用程序组UserDefaults中正确读取了
logo
和mannschaftsName
值:现在,您需要确保在主应用中正确设置这些值。在您发布的代码中,您只为
tabellenId
键设置了一个值:您还需要更新
logo
和mannschaftsName
:这可能会被提取出来,所以你 * 不要重复 *:
c8ib6hqw2#
2022年12月11日 08:33:36 Resoled
WidgetCenter.shared.reloadAllTimelines()
UserDefaults(suiteName: "...")!.string(forKey: "xxx")
只能在视图中使用,而不能在Widget或Widget Bundle中使用。顺便说一句:
WidgetCenter.shared.reloadTimelines(ofKind: "YourKind")
也工作正常。