0

我正在开发一款非常简单的 iPhone 游戏,该游戏涉及根据随机语音提示连续多次选择正确的彩色按钮。我已经设置好了,如果按钮是一种颜色并被点击,它总是每次都变成硬编码的颜色(例如,如果你点击红色,它总是变成蓝色)。颜色更改方法在 IBOutlet 中设置。我在 while 循环中设置了一个计时器,当计时器结束时,它会检查玩家是否做出了正确的选择。问题是直到计时器用完后按钮颜色才会发生变化,这会导致用于检查正确答案的方法出现问题。有没有办法让这种颜色变化立即发生?根据我的搜索,我知道这与故事板动作有关,直到代码执行后才发生,但我没有 使用计时器找不到任何东西。如果答案正确,这是调用计时器的方法的一部分:

BOOL rightChoice = true;
int colorNum;
NSDate *startTime;
NSTimeInterval elapsed;
colorNum = [self randomizeNum:middle];
[self setTextLabel:colorNum];
while (rightChoice){
    elapsed = 0.0;
    startTime = [NSDate date];
    while (elapsed < 2.0){
        elapsed = [startTime timeIntervalSinceNow] * -1.0;
        NSLog(@"elapsed time%f", elapsed);
    }
    rightChoice = [self correctChoice:middleStatus :colorNum];
    colorNum = [self randomizeNum:middle];
}
4

1 回答 1

2

两件事中的一件脱颖而出

  • 您正在使用 while 循环作为计时器,不要这样做 - 操作是同步的。
  • 如果这是在主线程上运行的,并且您的代码没有返回,您的 UI 将更新。口头禅是:“当你不回来时,你就是在阻止。”
  • Cocoa 有NSTimer异步运行的——这里是理想的。

因此,让我们掌握 NSTimer(或者您可以使用 GCD 并将队列保存到 ivar,但 NSTimer 似乎是正确的方法)。

制作一个名为 timer_ 的 ivar:

// Top of the .m file or in the .h
@interface ViewController () {
  NSTimer *timer_;
}
@end

做一些启动和停止功能。如何称呼这些取决于您。

- (void)startTimer {
  // If there's an existing timer, let's cancel it
  if (timer_)
    [timer_ invalidate];

  // Start the timer
  timer_ = [NSTimer scheduledTimerWithTimeInterval:5.0
                                            target:self
                                          selector:@selector(onTimerFinish:)
                                          userInfo:nil
                                           repeats:NO];
}

- (void)onTimerFinish:(id)sender {
  NSLog(@"Timer finished!");

  // Clean up the timer
  [timer_ invalidate];
  timer_ = nil;
}

- (void)stopTimer {
  if (!timer_)
    return;

  // Clean up the timer
  [timer_ invalidate];
  timer_ = nil;
}

现在

  • 将您的计时器测试代码放在 onTimerFinish 函数中。
  • 创建一个存储当前选择的 ivar。做出选择时更新此 ivar 并对 UI 进行相关更改。如果满足停止条件,则调用 stopTimer。
  • 在 onTimerFinished 中,您可以根据需要有条件地再次调用和 startTimer。

希望这可以帮助!

于 2012-04-26T14:54:08.457 回答