【发布时间】:2022-11-14 11:19:48
【问题描述】:
我想做一些看似简单的事情——我在 iPhone 上有一个应用程序可以让你更改日期。在手表上,我有一个并发症,其中显示了直到那个日期的日子。很明显,当您更改 iPhone 应用程序上的日期时,我希望手表上的日期发生变化,并且该状态一直持续到或者如果您再次更改 iPhone 上的日期。
我所做的是创建了一个包含在并发症和手表应用程序中的状态对象,并且在两者中我只是这样做以显示值
@ObservedObject state = OneDayState.shared
...
Text( state.daysUntilValue )
怎么了当我更改 iPhone 上的日期时:
- 如果手表应用程序处于活动状态并正在运行
- 应用程序上显示的日期会发生应有的变化
- 如果我回到主屏幕,并发症有旧的坏值
- 如果我重置手表 - 复杂功能现在具有正确的值
- 如果手表应用程序未激活且未运行
- 无论是复杂功能还是手表都没有获得新的价值
我什么想即将发生
- 当我更改 iphone 上的值时,应用程序即使没有运行也能获取新值
- 当我在 iPhone 上更改值时立即更改的并发症
这是我的状态对象的代码 - 我做错了什么? (谢谢)
class OneDayState : NSObject, ObservableObject, WCSessionDelegate
{
static let shared = OneDayState()
//
// connection to the settings
//
let session = WCSession.default
//
// connection to the user defaults
//
let settings = UserDefaults(suiteName: "[removed]")!;
//
// what is watched by the UI
//
var daysUntilValue : String {
return String( Calendar.current.dateComponents( [.day], from: .now, to: theDate).day!)
}
//
// the target date
//
@Published var theDate : Date = Date.now
//
// setup this
//
override init()
{
super.init()
session.delegate = self
session.activate()
theDate = settings.object(forKey: "target" ) as? Date ?? Date.now;
}
//
// you seem to have to override this
//
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
print("sesison activated")
}
//
// when the application context changes, we just store the new date
//
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any])
{
let newDate = applicationContext["target"] as? Date ?? Date.now;
DispatchQueue.main.async
{
self.settings.set( newDate, forKey: "target")
self.theDate = newDate;
}
}
}
【问题讨论】:
-
日期更改时如何重新加载并发症时间表?
-
我不 - 我认为这是观察对象的重点?但是我尝试将“用于 CLKComplicationServer.sharedInstance.activeComplications 中的复杂化??[] {CLKComplicationServer.sharedInstance.reloadTimeline(for:complication)}”放入我设置日期的位置,它没有任何区别
-
但我已经在并发症中设置了断点 - 没有事件触发,即使我正在发送输液器信息、trasnfercurrentcomplicationuserinfo 和 updateapplicationContext
-
更改为 WidgetCenter.shared.reloadAllTimelines()。也无所作为
标签: ios swiftui watchkit watchconnectivity apple-watch-complication