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

时间:2014-11-04 10:09:03

标签: ios cocoa-touch ios-app-extension

我正在处理今天的视图扩展,其中包含一些我未在界面构建器中设置的自定义视图元素。

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

我读到有关更新widgetPerformUpdateWithCompletionHandler中内容的内容,因此我实施了一项有关视图的新更新检查。

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

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

1 个答案:

答案 0 :(得分:2)

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

直接来自博客,该博客可帮助创建包含实时数据的今日小部件:

Creating today widget

  

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

修改

Apple documentation开始说明

  

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

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

对此不确定,但它声明以下方法由widget和包含应用程序使用以检查其内容。关于如何获取小部件快照没有太多细节。

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

NCWidgetController setHasContent

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

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

    <key>com.apple.security.application-groups</key>
    <array>
        <string>group.YourExtension</string>
    </array>
    
  2. 您看到密钥的值是group.YourExtension,它是共享的 主机应用和扩展应用的通用密钥

  3. 使用group.YourExtension

  4. 中的NSUserDefaults保存您的数据