【问题标题】:Changing the colour of a UIButton based on its tag根据标签更改 UIButton 的颜色
【发布时间】: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 *) 但看起来它仍然可以以更好的方式完成。
  • 我该怎么做?我以前从来没有涉足过这个,一个不发出警告的解决方案至少比发出警告的解决方案要好,即使它不漂亮。

标签: objective-c ios cocoa-touch 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,这是一种“快乐”。

        【讨论】:

          猜你喜欢
          • 2015-03-31
          • 1970-01-01
          • 2018-07-08
          • 1970-01-01
          • 2021-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多