得到iphone窗口背景颜色

时间:2010-03-07 22:05:00

标签: objective-c iphone

我一直在关注iTunes U上的斯坦福大学iphone视频。看到老师试图做类似这段代码的事情,但他意识到并说它不起作用虽然我没理解:

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

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

Objective-C,基于Windows的应用程序。不确定你还需要知道什么。

2 个答案:

答案 0 :(得分:5)

它不起作用的原因是UIView的{​​{1}}是backgroundColor属性。它的声明如下:

copy

这意味着当您从@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而不是'保留'。只能有一种颜色为红色,并且只能有一个包含“Hello world!”字符的字符串。因此,最终归结为一种形而上学的论证。

答案 1 :(得分: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的compare:方法。