根据标签更改 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 的颜色的主要内容,如果未能解决你的问题,请参考以下文章
根据状态更改 UIButton 中 ImageView 的 tint 颜色