Xcode - 每次迭代for循环更改按钮的图像

时间:2013-03-24 09:12:53

标签: xcode memory for-loop

我正在创建一个记忆游戏,并希望在for循环中每次迭代时更改四个按钮的图像。实际发生的事情是,在循环的最后一次迭代之前没有任何反应。

按下按钮时:

- (IBAction)bNewRound:(id)sender {
for (int i = 0; i < 10; i++) {
    numbers1[i] = arc4random()%4+1;
    NSLog(@"%i: %i", i, numbers1[i]);

    if (numbers1[i] == 1) {
        [self b1On];
    }
    if (numbers1[i] == 2) {
        [self b2On];
    }
    if (numbers1[i] == 3) {
        [self b3On];
    }
    if (numbers1[i] == 4) {
        [self b4On];
    }
    sleep(1);
    }
}

更改按钮图像的方法:

- (void)b1On {
NSLog(@"b1 state1");
[self.button1 setBackgroundImage:[UIImage imageNamed:@"memory_green.png"] forState: UIControlStateNormal];

bool1 = FALSE;
[self b2Off];
[self b3Off];
[self b4Off];
}
- (void)b1Off {
//  NSLog(@"b1 state2");
[self.button1 setBackgroundImage:[UIImage imageNamed:@"memory_grey.png"] forState: UIControlStateNormal];

bool1 = TRUE;
}

(仅适用于按钮1,但是你得到了它)

我按照日志中的代码一切正常,每秒生成一个新数字并保存在数组中,b1On-method(或b2On,b3On等)运行但行

[self.button1 setBackgroundImage:[UIImage imageNamed:@"memory_green.png"] forState: UIControlStateNormal];

每次迭代都不会改变图像。 但是当for循环结束时,数组中的最后一个(随机)按钮会将颜色变为绿色。

为什么不为for循环的每次迭代更新图像?

由于

1 个答案:

答案 0 :(得分:0)

  1. 永远不要在主线程上使用sleep()
  2. UI更新不会立即发生。它们发生在当前运行循环的末尾,这意味着在您的方法完成之后。
  3. 您可以使用NSTimer。这样的事情应该有效:

    - (void)timerFired:(NSTimer *)timer {
        _timerCount--;
        if (_timerCount <= 0) {
            [timer invalidate];
        }
        // do something
    }
    
    - (void)startTimer {
        [_timer invalidate];
        _timerCount = 10;
        _timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
    }