Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 获取iphone窗口背景色_Objective C_Iphone - Fatal编程技术网

Objective c 获取iphone窗口背景色

Objective c 获取iphone窗口背景色,objective-c,iphone,Objective C,Iphone,我一直在看iTunes U上的斯坦福大学iphone视频,看到老师试图做一些类似于此代码的事情,但他意识到并说这不起作用,尽管我不明白为什么: - (IBAction)flashPressed{ if (window.backgroundColor == [UIColor magentaColor]){ window.backgroundColor = [UIColor redColor]; }else { window.backgroundColor = [UIColor magenta

我一直在看iTunes U上的斯坦福大学iphone视频,看到老师试图做一些类似于此代码的事情,但他意识到并说这不起作用,尽管我不明白为什么:

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

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

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

要检查两种UIColor是否相等,请使用isEqual:消息而不是=运算符

if ([window.backgroundColor isEqual:[UIColor redColor]]) {
    NSLog(@"Yup, it's red");
} else {
    NSLog(@"OMG, it's not red!");
}
// result --> Yup, it's red
这是比较对象的一般模式,而不是像对int或float这样的基本体那样使用=。NSString的工作方式相同

信息太多部分:

具有定义顺序的对象的模式是给它们一个compare:method,该方法返回一个NSSortDescriptor。

它不起作用的原因是
UIView
backgroundColor
是一个
copy
属性。声明如下:

@property(nonatomic, copy) UIColor *backgroundColor;
这意味着,当您从
[UIColor redColor]
获取的颜色对象被设置为
背景颜色时,将复制整个对象,
UIView
保留的副本将位于与
UIColor
类对象保留的副本不同的内存地址

=
检查指针是否相同,这意味着只有当两个指针指向同一个对象时才会成功。这就是你有时想要做的。例如:

if ([aView superView] == self)
   [aView removeFromSuperview];
在这里,您需要确保
aView
的超级视图实际上就是这个对象,而不仅仅是根据某些标准“相同”的对象

但是,当比较两个字符串时,您(几乎总是)感兴趣的是它们是否包含相同的字符,而不管它们是否位于不同的内存地址上。因此,您使用:

if ([aString isEqualToString:anotherString])   // faster than isEqual:
在我们的例子中,颜色是一样的:我们想知道两个对象是否都代表红色,而不是两个指针是否指向完全相同的对象


如果
backgroundColor
属性被声明为
retain
,则可以使用
=
,并且它会一直工作,直到
UIColor
出于某种原因重新分配其
redColor
对象。这种情况不太可能发生,但要强调的是,对象代表一种独特的东西,像字符串和颜色这样的对象通常是复制的,而不是“保留的”。只能有一种红色,并且只能有一个包含字符“Hello world!”的字符串。因此,这最终归结为一个形而上学的论点。

谢谢你,如果你把答案包括在内,我会接受的,但你的理由很好,谢谢你。请不要删除你的答案。@Jonathan:这里面没有真正的问题,但你写道“他意识到并说它不起作用,尽管我不明白为什么”,我回答“它不起作用的原因是UIView的背景色是拷贝属性。”但别担心,我不会删除答案:)我同意,很好地解释了为什么会发生这种行为。我也学到了一些东西。