有一堆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 *'”
我该如何正确地做到这一点?
答案 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,这是一种“快乐”。