2010-03-07 86 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