2015-10-28 28 views
2

我最近遇到了一些關於視圖的行爲,當我試圖將「主題」類設置爲基本上充當我的整個應用程序顏色的主題/樣式表的單例。每個視圖都被賦予了作爲主題對象屬性的顏色。所以我會設置一個視圖的顏色,如:someDetailView.backgroundColor = [Theme SharedTheme].detailViewsBackgroundColor]以及我所有代碼的backgroundColor屬性在內存中引用此單個對象,然後我可以簡單地更改該對象的屬性,應用程序的外觀將反映該更改。但是,這些更改並未反映出來。這一事實可以減少到這樣的代碼:其中查看對象/狀態行爲的屬性

UIColor *someUIColorObject = [UIColor redColor]; 
    self.view.backgroundColor = someUIColorObject; 

    someUIColorObject= [UIColor yellowColor]; 

,根據我的初步設想,self.view會出現黃色,而是顯示爲紅色。我對OOP,引用類型和指針的一般理解是,如果有東西指向一個值並且你更新了該值,那麼指向該指針的任何東西都應該看到新的值。顯然,其他一些因素正在消除這一理論。也許某些視圖與繪製或運行循環有關的行爲,或者可能在view.backgroundColor下設置uicolor對象的副本。

無論如何,這偷看我的好奇心,至少可以是一個很好的學習機會。

回答

2

你是對的指針,但在這種情況下還有另一個問題。如果你看一下在documentationbackgroundColor屬性的定義,你會看到,它被定義爲:

@property(nonatomic, copy) UIColor *backgroundColor 

什麼copy做它實際上是複製的顏色,並將其存儲在backgroundColor財產。

因此,它不是指向您正在分配的原始指針,而是創建一個新實例並指向該新實例。

+0

謝謝。這是我的候選人理論之一,但我忘了查看頭文件來驗證它。既然如此,你是否知道回收我的主題Singleton類概念的明確方法?因此,通過更新其各種屬性,應用程序的外觀和感覺會更新爲大量? –

+0

@AlexanderBollbach這是一個有趣的問題。在我的應用程序中,我通常依靠NSNotifications來更新顏色主題。你可以嘗試在你的單例中創建一個數組,用於存儲使用塊創建的所有分配。您必須將顏色分配移至單獨的函數中,該函數將創建要執行的塊。我不確定這是否會起作用,但是如果您存儲這些塊,那麼在主題更改後,您可以重新執行它們。你需要小心,因爲有些視圖可能是零,因爲它們被釋放,所以你應該檢查你的塊。 –

+0

你能否通過存儲塊的分配來解釋你的意思?我正在考慮在單例中創建對每個「樣式」元素的引用,然後是遍歷引用並在其backgroundColor,borderWidth,屬性等上進行賦值的方法。這與您的意思相似嗎? –