显示今天视图小部件内容的正确方法
Posted
技术标签:
【中文标题】显示今天视图小部件内容的正确方法【英文标题】:Correct way to display today view widget content 【发布时间】:2014-11-04 10:09:02 【问题描述】:我正在开发一个今日视图扩展,其中包含一些我没有在界面构建器中设置的自定义视图元素。
现在我想知道生命周期中的正确点是在哪里初始化小部件内容。
我在widgetPerformUpdateWithCompletionHandler
中阅读了有关更新内容的信息,因此我实施了一项检查新更新应该与视图有关的内容。
但我的观察表明该方法是在viewDidAppear
之前调用的,因此没有要更新的视图。
此外,我认为小部件会在内存中保留一段时间,以便我可以在 widgetPerformUpdateWithCompletionHandler
中拥有某个对象,我可以在 viewDidAppear
中更新和使用其内容,但事实并非如此(它每次都会加载)
那么正确的方法是什么:在widgetPerformUpdateWithCompletionHandler
中将内容写入磁盘,我可以依赖内存中的某些内容还是在每次加载时忽略并刷新?
【问题讨论】:
【参考方案1】:在TodayViewController.m
-viewDidLoad()
方法在每次打开通知时都会被调用。因此,当您检查 Today 小部件时,它会调用 -viewDidLoad()
。因此,您可以在 -viewDidLoad()
中进行自定义。除非你不想检查以前的状态。
直接来自帮助使用实时数据创建 Today 小部件的博客:
Creating today widget
缓存 我们可以利用 NSUserDefaults 来节省启动之间计算的已用空间。小部件的生命周期很短,所以如果我们缓存这个值,我们可以用初始值设置用户界面,然后计算实际值。
编辑:
来自Apple documentation 声明
为了帮助您的小部件保持最新状态,系统有时会捕获小部件视图的快照。当小部件再次可见时,将显示最近的快照,直到系统将其替换为实时版本的视图。
也是状态,从通知中心,我们可以得到状态和快照的小部件细节。
对此不确定,但它指出小部件和包含应用程序都使用以下方法来检查其内容。没有关于如何获取小部件快照的详细信息。
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>
你看到 key 的值是group.YourExtension
它是共享的
主机应用和扩展应用的公共密钥
在NSUserDefaults
中使用group.YourExtension
保存您的数据
【讨论】:
是否可以在不将它们保存到 UserDefaults 的情况下检查以前的状态? @AzzUrr1:检查已编辑的答案,不确定有没有其他方法。 @Kampai 你能分享代码以显示内容应用程序中的小部件吗?上面的苹果文档链接不起作用。以上是关于显示今天视图小部件内容的正确方法的主要内容,如果未能解决你的问题,请参考以下文章