【问题标题】:UIButton Image doesn't changes in a "for" loopUIButton Image 在“for”循环中不会改变
【发布时间】:2011-04-13 11:16:36
【问题描述】:


我有一个问题:
我在没有 InterfaceBuilder 的情况下设计了我的 GUI,
现在我想在短时间内更改按钮的图像, 但它不会改变,直到整个 for 循环完成。 我究竟做错了什么?

    for (size_t i=0; i< 100; ++i){
      switch (variable) {
        case 0:
          [self changeRedButtonToWhite: redButton];
        break;
        case 1:
        ....
      }
    }

-(IBAction) changeRedButtonToWhite: (id)sender{
    [sender setBackgroundImage: whiteImage forState: UIControlStateNormal];
}

【问题讨论】:

  • 变量的起始值是多少?另外,for循环和switch/case语句的原因是什么?
  • 变量不重要。当变量为 0 时,没有任何反应。这就是重点?!?

标签: iphone objective-c ios uibutton


【解决方案1】:

您不能使用 for 循环来执行此操作,您应该尝试使用 NSTimer 代替。主线程内部发生循环时,UI 不会刷新。

【讨论】:

  • 但是我该怎么做呢?我有四种颜色,我希望它们随机闪烁,这是可变的。所以我认为我能做到这一点的唯一方法是使用 for - 循环
  • NSTimer 具有很短的延时调用一个随机更改颜色按钮的方法。
  • 非常感谢!效果很好!
【解决方案2】:

@Luzal 的解释是正确的。您正在设置按钮的背景颜色,但这只会导致按钮被标记为需要重绘。 (至少)在执行返回到运行循环之前不会发生重绘,并且在您的 for 循环完成之前不会发生。

我们无法从您发布的代码中看出您在 for 循环中还做了什么,但如果您使用它作为延迟机制,然后在 @987654321 时将按钮颜色更改回红色@命中99,无论如何这不是一个好计划。你可以使用 NSTimer 来管理颜色变化的持续时间,或者使用 -performSelector:afterDelay:,或者使用 Core Animation。

【讨论】:

    【解决方案3】:

    将 for 循环放在后台线程上,并在主线程上调用 -changeRedButtonToWhite。

    【讨论】:

      【解决方案4】:

      您不能执行以下操作吗?

      将所有按钮添加到NSMutableArray,或者如果您在分配后不打算向其中添加更多按钮,则只需使用NSArray

      NSMutableArray *buttonsArray = [[NSMutableArray alloc] initWithObjects:button1, button2, button3, nil]; //and so on....
      

      然后……

      for(UIButton *button in buttonsArray){
           [button setBackgroundImage: whiteImage forState: UIControlStateNormal];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 2021-03-06
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多