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

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 你能分享代码以显示内容应用程序中的小部件吗?上面的苹果文档链接不起作用。

以上是关于显示今天视图小部件内容的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

需要获取数据的 Android 小部件仅显示加载

如何遍历地图列表并在颤动列表视图中显示文本小部件?

Xamarin-iOS今日小部件,无法加载问题

iOS Today 扩展/小部件——位置权限?

使用 tkinter Treeview 小部件显示目录内容

找不到有关如何在自定义小部件中使用 ListView 的正确布局选项