@main
struct ClockWidgetExt: Widget {
private let kind: String = "ClockWidgetExt"
public var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider(), placeholder: PlaceholderView()) { entry in
HomeTestView()
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
}
}
Run Code Online (Sandbox Code Playgroud)
如何从我的主应用程序获取数据到小部件?
我的代码获取两个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) 使用 Xcode 12 尝试为我的项目创建 Widget 应用程序扩展。
创建新的 Widget 目标后,我收到以下错误:
'Widget' is annotated with @main and must provide a main static function of type () -> Void or () throws -> Void.
Run Code Online (Sandbox Code Playgroud)
点击 WidgetKit 小部件会自动启动其父应用程序。如何检测我的应用程序是否是从其 WidgetKit 小部件扩展启动的?
我无法在应用程序AppDelegate
和/或SceneDelegate
.
我有一个带有两个文本的简单小部件(中等大小),我想要的是能够执行深层链接以将用户引导到我的应用程序的特定部分,但我似乎找不到方法这样做。
我写的视图(非常简单):
HStack {
Text("FIRST ITEM")
Spacer()
Text("SECOND ITEM")
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试更换
Text("SECOND ITEM")
Run Code Online (Sandbox Code Playgroud)
和
Link("SECOND ITEM destination: URL(string: myDeeplinkUrl)!)
Run Code Online (Sandbox Code Playgroud)
但它也不起作用。
我正在开发使用 widgetkit 扩展的应用程序。我有一个奇怪的问题,比如小部件在开发端正确显示,但是当我让应用程序上线时,它会向用户显示空白(黑色)小部件。
开发应用程序时的屏幕截图。
使应用程序上线时的屏幕截图。
以下是我的小部件的代码
import SwiftUI
import WidgetKit
import UIKit
private struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date(), water: drunkGlassesInML.convertInMLfromLTR())
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> Void) {
let entry = SimpleEntry(date: Date(), water: drunkGlassesInML.convertInMLfromLTR())
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
var entries: [SimpleEntry] = []
let entryDate = Calendar.current.date(byAdding: .second, value: 10 , to: Date())!
let entry = SimpleEntry(date: entryDate, water: drunkGlassesInML.convertInMLfromLTR()) …
Run Code Online (Sandbox Code Playgroud) 我有一个如下所示的小部件视图:
struct WidgetEntryView: View {
var entry: Provider.Entry
@Environment(\.widgetFamily) var family
var body: some View {
switch family {
case .systemSmall:
ZStack {
VStack(spacing: 12) {
// ...
}
.padding(10)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
.background(Color.red.edgesIgnoringSafeArea(.all))
case .systemMedium:
ZStack {
VStack(spacing: 12) {
// ...
}
.padding(10)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
.background(Color.blue.edgesIgnoringSafeArea(.all))
default:
ZStack {
VStack(spacing: 12) {
// ...
}
.padding(10)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
.background(Color.black.edgesIgnoringSafeArea(.all))
}
}
}
Run Code Online (Sandbox Code Playgroud)
该小部件支持所有 3 个主要尺寸系列:
struct MyWidget: Widget {
let …
Run Code Online (Sandbox Code Playgroud) 最初的问题是在 Apple 论坛上,但没有人可以提供帮助。 https://developer.apple.com/forums/thread/654967?answerId=622833022#622833022
我决定问 SO。
我正在开发一个显示来自 REST api 的内容的小部件扩展。它显示更新的以下股票信息。
Widgets Code-along,第 3 部分:推进时间线对我没有帮助。
调查给我带来了一个虽然“这是 iOS 测试版的错误”:
public func timeline(
for configuration: ConfigurationIntent,
with context: Context,
completion: @escaping (Timeline<Entry>) -> ()
) {
print("Provider.timeline: ")
var entries: [SimpleEntry] = []
let currentDate = Date()
entries.append(SimpleEntry(
date: Calendar.current.date(byAdding: .second, value: 15, to: currentDate)!,
configuration: configuration
))
let timeline = Timeline(entries: entries, policy: reloadPolicy)
completion(timeline)
}
Run Code Online (Sandbox Code Playgroud)
上面的代码Provider.timeline:
在 1 秒内打印14->19 次。
这是我处理网络请求但没有成功的代码:
public func timeline(
for configuration: ConfigurationIntent,
with …
Run Code Online (Sandbox Code Playgroud) 是否可以在 Widget 中创建显示当前时间并实时更新的文本标签?
尝试创建时钟小部件,但小部件每 5 分钟仅更新 1 次。
这是一个有趣的困境:我想制作一个可靠地“滴答”的计时器,但同时也在可预测的位置渲染符号,以便我可以通过添加背景来装饰计时器。由于 WidgetKit 的限制,我无法可靠地每秒渲染自己的文本,并且必须依赖特殊视图,例如Text(Date(), style: .timer)。但是,此视图可以根据剩余时间将时间呈现为XX:XX和X:XX ,这没问题,但它也占用容器的整个宽度并左对齐,这使得最后一个:XX根据剩余时间移动。
\n这是一个例子:
\n\n以及生成它的代码:
\nstruct MyWidgetEntryView : View { \n var body: some View {\n VStack {\n Text(Date().addingTimeInterval(1000), style: .timer)\n .font(.body.monospacedDigit())\n .background(Color.red)\n \n Text(Date().addingTimeInterval(100), style: .timer)\n .background(Color.green)\n .font(.body.monospacedDigit())\n }\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n问题:有没有一种方法可以在 WidgetKit 小部件中可靠地更新时间显示,使分钟和秒的符号始终呈现在相同的位置,并且不会根据剩余时间而移动?
\n我无法弄清楚,请帮助我!
\n\xe2\x80\x93巴格兰
\n