CLKComplicationServer 的 activeComplications 为 nil,尽管显示了并发症
activeComplications of the CLKComplicationServer are nil, although a complication is displayed
我有一个带有复杂功能的手表应用程序。更新表盘上的复杂功能确实有效了很长时间,但最近停止了,可能是由于 watchOS 更新。
原因是 CLKComplicationServer.sharedInstance()
的 activeComplications
属性 是 nil
,虽然我的并发症占位符显示在表盘(设备和模拟器)上。
代码再简单不过了:
final class ComplicationController: NSObject, CLKComplicationDataSource {
// …
func updateComplications() {
//…
let complicationServer = CLKComplicationServer.sharedInstance()
if let activeComplications = complicationServer.activeComplications {
for complication in activeComplications {
complicationServer.reloadTimeline(for: complication)
}
}
//…
}
//…
}
如果我在 if let
指令的断点处停止,complicationServer
具有以下值:
下面的 lldb 命令输出 nil
:
可能是什么原因?
我的缺点:,但是重构app的时候忘了解决方法
其实我不知道这是解决方案、变通方法还是 hack:
我怀疑如果在代码中的任何地方执行 ComplicationController.shared
,CLKComplicationServer
或其 CLKComplicationDataSource
,即 ComplicationController
未正确初始化。如果不是,则 ComplicationController
由 CLKComplicationServer
.
正确初始化
因此,不能调用ComplicationController
中的任何函数,例如更新并发症。相反,可以向执行请求的函数的 ComplicationController
发送通知。当然,必须确保 ComplicationController
已经初始化并注册以在发布之前接收这样的通知。
如果是这样,CLKComplicationServer.sharedInstance().activeComplications
就不再是 nil
,并且并发症更新有效。
我有一个带有复杂功能的手表应用程序。更新表盘上的复杂功能确实有效了很长时间,但最近停止了,可能是由于 watchOS 更新。
原因是 CLKComplicationServer.sharedInstance()
的 activeComplications
属性 是 nil
,虽然我的并发症占位符显示在表盘(设备和模拟器)上。
代码再简单不过了:
final class ComplicationController: NSObject, CLKComplicationDataSource {
// …
func updateComplications() {
//…
let complicationServer = CLKComplicationServer.sharedInstance()
if let activeComplications = complicationServer.activeComplications {
for complication in activeComplications {
complicationServer.reloadTimeline(for: complication)
}
}
//…
}
//…
}
如果我在 if let
指令的断点处停止,complicationServer
具有以下值:
下面的 lldb 命令输出 nil
:
可能是什么原因?
我的缺点:
其实我不知道这是解决方案、变通方法还是 hack:
我怀疑如果在代码中的任何地方执行 ComplicationController.shared
,CLKComplicationServer
或其 CLKComplicationDataSource
,即 ComplicationController
未正确初始化。如果不是,则 ComplicationController
由 CLKComplicationServer
.
因此,不能调用ComplicationController
中的任何函数,例如更新并发症。相反,可以向执行请求的函数的 ComplicationController
发送通知。当然,必须确保 ComplicationController
已经初始化并注册以在发布之前接收这样的通知。
如果是这样,CLKComplicationServer.sharedInstance().activeComplications
就不再是 nil
,并且并发症更新有效。