0

私は記憶ゲームを作成しており、for ループの反復ごとに 4 つのボタンの画像を変更したいと考えています。実際に起こることは、ループの最後の反復まで何も起こらないということです。

ボタンを押すと:

- (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 メソッド (または b2On、b3On など) が実行されますが、行は

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

繰り返しごとに画像を変更しません。ただし、for ループが終了すると、配列内の最後の (ランダムな) ボタンの色が緑色に変わります。

for ループの反復ごとに画像が更新されないのはなぜですか?

ありがとう

4

1 に答える 1

0
  1. sleep()メインスレッドでは絶対に使用しないでください
  2. UI の更新はすぐには行われません。それらは現在の実行ループの最後、つまりメソッドが完了した後に発生します。

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];
}
于 2013-03-24T12:49:20.367 に答える