2014-11-04 68 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