根据标签更改UIButton的颜色

时间:2012-12-27 14:22:20

标签: objective-c ios cocoa-touch uibutton

有一堆UIButton,其中一些需要根据情况改变颜色,目前它的处理方式如下:

UIButton *button;
button = [self.view viewWithTag:positionInArray];
[button setBackgroundColor:[UIColor cyanColor]];
button = [self.view viewWithTag:positionInArray-1];
[button setBackgroundColor:[UIColor cyanColor]];
button = [self.view viewWithTag:positionInArray+3];
[button setBackgroundColor:[UIColor cyanColor]]
button = [self.view viewWithTag:positionInArray+4];
[button setBackgroundColor:[UIColor cyanColor]];

可行,但将按钮设置为标签的代码会抛出此警告:

“不兼容的指针类型初始化'UIButton * __ strong',表达式为'UIView *'”

我该如何正确地做到这一点?

4 个答案:

答案 0 :(得分:1)

问题是,viewWithTag:可能会返回UIView的任何子类。如果你知道它会返回一个UIButton肯定你可以像这样投射它:

button = (UIButton *)[self.view viewWithTag:positionInArray];

这将隐藏警告,但当视图不是按钮时可能会产生意外结果!一个更好的解决方案是检查返回的UIView子类是否是UIButton:

UIView *view = [self.view viewWithTag:positionInArray];
if ([view isKindOfClass:[UIButton class]]) {
   button = (UIButton *)view;
   [button setBackgroundColor:[UIColor cyanColor]];
} else {
   NSLog(@"Ooops, something went wrong! View is not a kind of UIButton.");
}

答案 1 :(得分:1)

问题是viewWithTag:会返回UIView,因为它可以是UIView的任何子类,包括UIButton

这取决于设计,如果您没有任何其他具有此标记的子视图,那么您应该将结果转换为UIButton,就像其他答案一样,并完成它:)

答案 2 :(得分:0)

您需要将UIViews转换为UIButtons,如下所示:

button = (UIButton *)[self.view viewWithTag:positionInArray];

最好通过执行以下操作来验证您的视图实际上是按钮:

UIView *button = [self.view viewWithTag:positionInArray];
if ([button isKindOfClass[UIButton class]] {
    [button setBackgroundColor:[UIColor cyanColor]]; 
}

在这个例子中,没有必要过分UIButton,因为UIViews也有这种方法。如果你只想改变UIButton的颜色,你只需要if语句。

答案 3 :(得分:0)

向下转换

viewWithTag:返回一个UIView,但它可能指向UIView对象的任何子类。
由于多态性是有效的,并且消息传递是动态的,您可以这样做:

UIView *button;
button = [self.view viewWithTag:positionInArray];
[button setBackgroundColor:[UIColor cyanColor]];

你从UIView继承了backgroundColor,所以没有任何问题 但是你总是可以使用类型id,这是一种“快乐”。