我创建了一个小部件,我想每三秒更新一次。
我有以下代码:
struct WidgetModel : TimelineEntry
{
var date: Date
var data: [Data]
}
func getTimeline(in context: Context, completion: @escaping (Timeline<WidgetModel>) -> Void)
{
let controller = DataController()
controller.refresh()
let nextRefresh = Calendar.current.date(byAdding: .second, value: 3, to: Date())!
let model = WidgetModel(date: nextRefresh, data: controller.data)
let timeline = Timeline(entries: [model], policy: .atEnd)
completion(timeline)
}
Run Code Online (Sandbox Code Playgroud)
但是,这三秒将被忽略。模拟器总是显示下一次刷新将在五分钟后。我还尝试使用 .after 而不是 .atEnd,但这没有任何效果。五分钟是最小值还是与模拟器有关?
我有一个从我的应用程序获取数据的小部件。该小部件工作正常,但更新不够频繁。理想情况下,我希望它能够在我的应用程序中删除或添加项目时进行更新,因此如果有一种方法可以强制小部件更新,那么这是可行的。否则,如果小部件可以更频繁地获取新数据,那么也可以正常工作。
数据存储在应用程序组中的 json 文件中。我将该数据加载并解码到一个数组中,然后从该数组中选择一个随机项目进行显示。
这是小部件提供程序:
let testBook = Book(id: UUID(), name: "Name", author: "Author", genre: "Error", page: "0", total: "77")
public enum AppGroup: String {
case Livre = "group.com.identifier"
public var containerURL: URL {
switch self {
case .Livre:
return FileManager.default.containerURL(
forSecurityApplicationGroupIdentifier: self.rawValue)!
}
}
}
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date(), book: testBook)
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date(), book: testBook)
completion(entry) …
Run Code Online (Sandbox Code Playgroud) 我在实时活动中添加了Text(Date().addingTimeInterval(2400), style: .timer)
,但是当倒计时为零并且通知尚未发送时,它就开始计数。
可以修复吗?
我尝试使用普通计时器,但在实时活动中它不起作用
我正在尝试使用新类型创建一个 WatchOS 扩展.accessoryInline
,但我不明白为什么我不能在主水平堆栈中拥有多个堆栈。
请参阅以下注释代码和 WatchOS 模拟器中的不可见堆栈
struct WidgetInlineView : View {
var entry: BurnoutTimelineEntry
var body: some View {
HStack(spacing: 5) {
HStack {
Image("widgetWork")
Text(entry.exchange.todayWork.durationString)
}
HStack {
Image("widgetPause")
Text(entry.exchange.todayPause.durationString)
}
}
}
}
struct WidgetInline: Widget {
var body: some WidgetConfiguration {
StaticConfiguration(kind: "MyKind", provider: BurnoutTimelineProvider()) { entry in
WidgetInlineView(entry: entry)
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
.supportedFamilies([.accessoryInline])
}
}
struct WidgetInline_Previews: PreviewProvider {
static var previews: some View {
WidgetInlineView(entry: BurnoutTimelineEntry(date: Date()))
.previewContext(WidgetPreviewContext(family: …
Run Code Online (Sandbox Code Playgroud)