【问题标题】:Correct way to display today view widget content显示今天视图小部件内容的正确方法
【发布时间】:2014-11-04 10:09:02
【问题描述】:

我正在开发一个今日视图扩展,其中包含一些我没有在界面构建器中设置的自定义视图元素。

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

我在widgetPerformUpdateWithCompletionHandler 中阅读了有关更新内容的信息,因此我实施了一项检查新更新应该与视图有关的内容。

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

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

【问题讨论】:

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


    【解决方案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:

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

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

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

    【讨论】:

    • 是否可以在不将它们保存到 UserDefaults 的情况下检查以前的状态?
    • @AzzUrr1:检查已编辑的答案,不确定有没有其他方法。
    • @Kampai 你能分享代码以显示内容应用程序中的小部件吗?上面的苹果文档链接不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多