2014-11-04 67 views
3

我正在使用一些自定义视图元素,我没有在界面生成器中设置今天的视图扩展。正确的方式来显示今日视图控件内容

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

我阅读了关于更新widgetPerformUpdateWithCompletionHandler中的内容的内容,所以我实施了一个关于视图的新更新检查。

但是我的观察结果告诉我,该方法在viewDidAppear之前调用,所以没有更新的视图。 此外,我因子评分小部件保留在内存中了一会儿,这样我可以在widgetPerformUpdateWithCompletionHandler其内容我可以更新和viewDidAppear使用,但这并非如此有一定的对象(它加载每次)

那么什么是正确的方法:在widgetPerformUpdateWithCompletionHandler中写入内容到磁盘,我可以依赖内存中的某些内容,或只是忽略并刷新每个负载?

回答

2

TodayViewController.m-viewDidLoad()方法每次打开通知时都会调用。因此,如果您选中“今日”小部件,它将会调用-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你的数据在NSUserDefaults

+0

是否可以检查以前的状态不保存他们到UserDefaults? – arnoapp 2014-11-04 10:29:18

+0

@ AzzUrr1:检查已编辑的答案,不确定是否有其他方法。 – Kampai 2014-11-04 10:44:43

+0

@Kampai可以请你分享代码以显示来自内容应用程序的小部件吗?上面的Apple文档链接不起作用。 – 2016-07-25 13:48:58