我的代码获取两个JSON变量,应该在我的小部件上显示它们。小部件保持空白。如果没有小部件,它会显示我的应用程序中的所有内容。
我究竟做错了什么?代码中的 API 仅用于测试,因此您也可以对其进行检查。是否需要更改某些内容才能使其显示在小部件中?
我的结构:
import Foundation
struct Results: Decodable {
let data: [Post]
}
struct Post: Decodable, Identifiable {
let id: String
var objectID: String {
return id
}
let home_name: String
let away_name: String
}
Run Code Online (Sandbox Code Playgroud)
获取 JSON:
import Foundation
class NetworkManager: ObservableObject {
@Published var posts = [Post]()
@Published var test = ""
@Published var test2 = ""
func fetchData() {
if let url = URL(string: "https://livescore-api.com/api-client/teams/matches.json?number=10&team_id=19&key=I2zBIRH3S01Kf0At&secret=6kLvfRivnqeNKUzsW84F0LISMJC1KdvQ&number=7&team_id=46") {
let session = URLSession(configuration: .default)
let task = …Run Code Online (Sandbox Code Playgroud) 我正在使用一个UIKit应用程序并添加了一个带有SwiftUI和 的小部件Widgetkit。现在,当用户在主应用程序中执行某项操作时,我想更新小部件。
通常我应该使用 WidgetCenter.shared.reloadAllTimelines()对吗?但这仅适用于SwiftUI.
我可以说我的小部件应该每秒重新加载。但我的小部件执行 json 请求。这也会每秒执行我不想要的 json 请求。
为您提供信息。主应用UserDefaults程序与小部件共享。根据它的不同UserDefaults,它会读取它并改变它的外观。
现在,小部件在首次添加时会加载正确的 UserDefault。但正如我所说,更改添加的小部件不起作用。
我想删除和添加小部件不是一个用户友好的选项。
现在我的 Widget 每秒发出大约 1 个请求。我想将其更改为 1 小时内 1 个请求。
我在网上遇到了一些let timeline = ...类似的错误Value of optional type 'Date?' must be unwrapped to a value of type 'Date'以及更多错误。
任何可能出错的建议:
struct Provider: IntentTimelineProvider {
let networkManager = NetworkManager()
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date(), configuration: ConfigurationIntent(), clubname: networkManager.clubName)
}
func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date(), configuration: configuration, clubname: networkManager.clubName)
completion(entry)
}
func getTimeline(for configuration: …Run Code Online (Sandbox Code Playgroud) 我想将一个变量从我的 UIKit 文件共享到我用 SwiftUI 创建的小部件扩展。 我跟着这个here。请看看 J Arango 的回答。
但我不明白那里的最后一部分。我必须使用import MySharedObjects.
所以我这样做了:
import MySharedObject
struct testing {
let mySharedObject = MySharedObject(name: "My Name", lastName: "My Last Name")
do {
let data = try JSONEncoder().encode(mySharedObject)
/// Make sure to use your "App Group" container suite name when saving and retrieving the object from UserDefaults
let container = UserDefaults(suiteName:"group.com.widgetTest.widgetContainer")
container?.setValue(data, forKey: "sharedObject")
/// Used to let the widget extension to reload the timeline
WidgetCenter.shared.reloadAllTimelines()
} catch {
print("Unable to …Run Code Online (Sandbox Code Playgroud)