根据标签更改 UIButton 的颜色

Posted

技术标签:

【中文标题】根据标签更改 UIButton 的颜色【英文标题】:Changing the colour of a UIButton based on its tag 【发布时间】:2012-12-27 14:22:20 【问题描述】:

得到了一堆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' 的不兼容指针类型”

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

【问题讨论】:

您可以转换为 (UIButton *) 但看起来它仍然可以以更好的方式完成。 我该怎么做?我以前从来没有涉足过这个,一个不发出警告的解决方案至少比发出警告的解决方案要好,即使它不漂亮。 【参考方案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.");

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您需要像这样将您的 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 语句。

【讨论】:

【参考方案4】:

向下转换

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

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

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

【讨论】:

以上是关于根据标签更改 UIButton 的颜色的主要内容,如果未能解决你的问题,请参考以下文章

Iphone UIButton 背景颜色

Swift UIButton 子类并根据变量更改颜色

如何更改 UIButton 标题?

根据状态更改 UIButton 中 ImageView 的 tint 颜色

在 Swift 中按下 uibutton 时更改色调图像颜色

使用清晰的背景颜色使 UIButton 内容完全可点击