【问题标题】:continously change UIView background color不断改变 UIView 背景颜色
【发布时间】:2026-01-09 04:05:02
【问题描述】:

我是 iphone dev 的新手,正在阅读 Apress.Beginning.Iphone4.Dev,不知道这是否是成为开发 iphone 应用程序的最快方法。 嗯,我现在在第4章,我已经完成了示例代码,但是我想添加一个小mod。

  • 按钮叫迪斯科
  • 如果按下,Touch Up Inside 将开始改变 self.view.backgroundColor 随机取值 100 次 在 for 循环中。

    我的问题是只有在 IBAction 连接到按钮后背景才会改变 迪斯科,完成了,所以我只能看到一种颜色变化,而不是至少两种颜色变化。

我的怀疑是,在 IBAction 完成之前,视图不会刷新/重新加载,这种怀疑是否正确?

是否有可能实现我希望实现的功能, - 触摸一个按钮 - 背景颜色随机变化100次。

在此先感谢您,并对新问题表示抱歉。 时间x88

==========================

谢谢大家,感谢您的指点,我得到了这个工作。但不是 100 次, 我让changeBgColor 方法无限期地运行。

我注意到的是,当changeBgColor 仍在运行时,如果我要触摸迪斯科 再次按钮,changeBgColor方法被执行的频率变高了,谁能解释一下原因?

再次感谢 时间x 88

【问题讨论】:

    标签: iphone


    【解决方案1】:
    - (IBAction)changeColor:(id)sender
    {
      if (_timer == nil)
      {
        _changeColorCount = 0;
        _timer = [NSTimer scheduledTimerWithTimeInterval:0.2 
                                                  target:self 
                                                selector:@selector(colorTimerFired) 
                                                userInfo:nil 
                                                 repeats:YES];
      }
    }
    
    - (void)colorTimerFired
    {
        if (_changeColorCount > 100)
        {
            [_timer invalidate];
            _timer = nil;
        }
        else
        {
             [view setBackgroundColor:newRandomColor];
             _changeColorCount++;
        }
    }
    

    【讨论】:

    • 对不起,因为我是新手,我想确认一下,在您上面的代码中,_timer 是如何以及在哪里声明的? ,再次感谢。
    • _timer 是实例变量,所以你需要在@interface 部分声明它。
    • 您需要在@interface 部分声明它:NSTimer* _timer;。定时器会每 0.2 秒调用一次 colorTimerFired 方法,所以在这个例子中,视图颜色每秒会改变 5 次。 100 次后,您通过调用 [_timer invalidate] 来停止计时器,这会将其从运行循环中删除。此外,您使指针无效,因此下次按下按钮时,您可以运行另一个计时器。
    【解决方案2】:

    您可以更改方法中的颜色并使用 NSTimer 调用此方法。将 NSTimer 的重复设置为 YES。然后您的方法将被再次调用

    【讨论】:

      【解决方案3】:

      在迪斯科按钮上点击写下面的代码

      NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 
                                                        target:self 
                                                      selector:@selector(changeColor)  
                                                      userInfo:nil 
                                                       repeats:YES];
      

      现在创建一个新方法如下, 在.h 文件中声明int i 并在viewDidLoad 中初始化为0。

      - (void) changeColor
      {
         // code for color change;
         i++;
         if (i==100)
         {
           [timer invalidate];
         }
      }
      

      【讨论】:

      • 谢谢,但是 NSTimer 声明应该是一个指针, NSTimer *timer = [[NSTimer alloc] ......]; ,因为逐字使用你的代码,导致编译错误“Invalid initializer”
      • 是的,我忘记了,但是这样做......我正在编辑那个......请继续接受答案......
      • 嗯抱歉,我关闭了问题吗?没意识到
      • 我的意思是,如果您发现答案正确,那么请给答案​​打分或投票...