正确显示今天视图小部件内容的方式

我正在使用一些自定义视图元素处理今天的视图扩展,我没有在界面构建器中设置它们。

现在我想知道生命周期中正确的点是初始化小部件内容。

我读到了有关更新widgetPerformUpdateWithCompletionHandler的内容的内容,因此我实现了对应该关于视图的新更新的检查。

但我的观察结果表明,该方法在viewDidAppear之前被调用,因此没有更新的视图。 此外,我试图将小部件保留在内存中一段时间​​,以便我可以在widgetPerformUpdateWithCompletionHandler拥有一个特定的对象,其内容我可以在viewDidAppear更新和使用,但事实并非如此(每次都加载)

那么正确的方法是什么:在widgetPerformUpdateWithCompletionHandler内容写入磁盘,我可以依赖于内存中的内容,还是只是忽略并刷新每次加载?

在每次打开通知时调用TodayViewController.m -viewDidLoad()方法。 因此,当您检查Today小部件时,它将调用-viewDidLoad() 。 所以你在-viewDidLoad()自定义。 除非你不想检查以前的状态。

直接来自博客,帮助创建具有实时数据的今日小部件:

创建今天小部件

缓存我们可以利用NSUserDefaults来保存启动之间计算的已用空间。 窗口小部件的生命周期很短,因此如果我们缓存此值,我们可以使用初始值设置用户界面,然后计算实际值。

编辑:

从Apple文档中可以看出这一点

为了帮助您的窗口小部件查看最新版本,系统偶尔会捕获窗口小部件视图的快照。 当窗口小部件再次可见时,将显示最新的快照,直到系统将其替换为视图的实时版本。

从通知中心,我们也可以获得状态和快照的小部件细节。

不确定这一点,但它声明下面的方法被小部件和包含应用程序用于检查其内容。 关于如何获取小部件快照没有太多细节。

  func setHasContent(_ flag: Bool, forWidgetWithBundleIdentifier bundleID: String!) 

NCWidgetController setHasContent

编辑2:在扩展中使用NSUserDefaults:

  1. 您有两个.entitlements文件,一个用于主机应用程序,第二个用于扩展应用程序,在两个文件中添加以下键

     com.apple.security.application-groups  group.YourExtension  
  2. 您看到key的值是group.YourExtension它是主机应用和扩展应用的共享公钥

  3. 使用group.YourExtension中的NSUserDefaults保存数据