0

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

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]];

它可以工作,但是将按钮设置为标签的代码会引发以下警告:

“使用 'UIView *' 类型的表达式初始化 'UIButton *__strong' 的不兼容指针类型”

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

4

4 回答 4

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.");
}
于 2012-12-27T14:27:18.790 回答
1

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

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

于 2012-12-27T14:27:51.467 回答
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 语句。

于 2012-12-27T14:25:47.140 回答
0

向下转换的替代方案

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

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

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

于 2012-12-27T14:37:53.783 回答