2010-03-07 134 views
0

我一直在iTunes U上看斯坦福大學的iPhone視頻。看到老師試圖做類似於這個代碼的東西,但他意識到並說它沒有工作,雖然我沒有得到原因:得到iPhone窗口背景顏色

- (IBAction)flashPressed{ 
if (window.backgroundColor == [UIColor magentaColor]){ 

window.backgroundColor = [UIColor redColor]; 
}else { 
window.backgroundColor = [UIColor magentaColor]; 
} 
} 

Objective-C,基於Windows的應用程序。不知道你還需要知道什麼。

+0

哪個講座? – willc2 2010-03-07 22:16:34

+0

數字4或5我認爲 – 2010-03-08 07:53:41

回答

3

要檢查兩個UIColors是否相等,請使用isEqual:消息而不是==運算符。

if ([window.backgroundColor isEqual:[UIColor redColor]]) { 
    NSLog(@"Yup, it's red"); 
} else { 
    NSLog(@"OMG, it's not red!"); 
} 
// result --> Yup, it's red 

這是比較對象,而不是使用==像你像整數或浮點數元做一種普遍現象。 NSString的工作方式相同。

太多的信息部分:
圖案對於具有所定義的順序的對象是給他們一個比較:一個返回NSSortDescriptor方法。

5

它不起作用的原因是UIViewbackgroundColorcopy屬性。它的聲明如下:

@property(nonatomic, copy) UIColor *backgroundColor; 

這意味着,當你從[UIColor redColor]獲取顏色對象設置爲backgroundColor,整個對象被複制,並通過UIView保留副本將在不同的內存地址比UIColor類對象保留的那個更大。

==檢查指針是否相同,這意味着只有當兩個指針指向同一個對象時它纔會成功。這是你有時想要做的。例如:

if ([aView superView] == self) 
    [aView removeFromSuperview]; 

在這裏,你要確保aView的超級觀點實際上是這個非常對象,而不僅僅是一個是‘相同’根據一些標準。

但是,當你比較兩個字符串時,你(幾乎總是)對它們是否包含相同的字符感興趣,並且它們是否在不同的存儲器地址上並不重要。因此,你使用:

if ([aString isEqualToString:anotherString]) // faster than isEqual: 

而且在我們與顏色的例子,這是相同的:我們想知道兩個對象是否都代表紅色,而不是是否兩個指針指向完全​​相同的對象。

如果backgroundColor財產被宣佈爲retain,你也可以使用==,並且它會一直工作到UIColor出於某種原因重新分配其redColor對象。這不太可能發生,但是要強調的是,對象表示一種獨特的東西,像字符串和顏色的對象通常是copied而非「已經存在」。只能有一種顏色爲紅色,並且只能有一個包含字符「Hello world!」的字符串。所以最終歸結爲一個形而上學的論證。

+0

謝謝,如果你已經包括了我會接受的答案,但是你的理由非常好,謝謝。請不要刪除你的答案。 – 2010-03-08 07:52:59

+0

@Jonathan:那裏沒有一個真正的問題,但是你寫下了「他意識到並且說雖然我沒有明白爲什麼,但它沒有工作」,我回答說:「它不起作用的原因是UIView的backgroundColor是一個複製屬性。「但不要擔心,我不會刪除答案:) – Felixyz 2010-03-08 12:30:23

+0

我同意,很好的解釋爲什麼會發生這種行爲。我也學到了一些東西。 – willc2 2010-03-08 15:35:27