我正在处理今天的视图扩展,其中包含一些我未在界面构建器中设置的自定义视图元素。
现在我想知道生命周期中的正确点是在哪里初始化小部件内容。
我读到有关更新widgetPerformUpdateWithCompletionHandler
中内容的内容,因此我实施了一项有关视图的新更新检查。
但是我的观察结果显示该方法在viewDidAppear
之前被调用,因此没有更新的视图。
此外,我还试着将小部件保留在内存中一段时间,以便我可以在widgetPerformUpdateWithCompletionHandler
中拥有某个对象,其内容我可以更新并在viewDidAppear
中使用,但事实并非如此(它加载每一次)
那么正确的方法是什么:在widgetPerformUpdateWithCompletionHandler
中将内容写入磁盘,我可以依赖内存中的内容,还是只在每次加载时忽略和刷新?
答案 0 :(得分:2)
每次打开通知时都会调用TodayViewController.m
-viewDidLoad()
方法。因此,当您检查Today小部件时,它将调用-viewDidLoad()
。因此,您可以在-viewDidLoad()
中进行自定义。除非你不想检查以前的状态。
直接来自博客,该博客可帮助创建包含实时数据的今日小部件:
<强>缓存强> 我们可以利用NSUserDefaults来保存启动之间计算的已用空间。窗口小部件的生命周期很短,因此如果我们缓存此值,我们可以使用初始值设置用户界面,然后计算实际值。
修改强>
从Apple documentation开始说明
为了帮助您的窗口小部件查看最新版本,系统偶尔会捕获窗口小部件视图的快照。当窗口小部件再次可见时,将显示最新的快照,直到系统将其替换为视图的实时版本。
从通知中心,我们也可以获得状态和快照的小部件细节。
对此不确定,但它声明以下方法由widget和包含应用程序使用以检查其内容。关于如何获取小部件快照没有太多细节。
func setHasContent(_ flag: Bool,
forWidgetWithBundleIdentifier bundleID: String!)
NCWidgetController setHasContent
编辑2:在扩展程序中使用NSUserDefaults:
您有两个.entitlements
个文件,一个用于主机应用,第二个用于扩展应用,在两个文件中添加以下键
<key>com.apple.security.application-groups</key>
<array>
<string>group.YourExtension</string>
</array>
您看到密钥的值是group.YourExtension
,它是共享的
主机应用和扩展应用的通用密钥
使用group.YourExtension
NSUserDefaults
保存您的数据
醇>