7

我正在为我的 mac 在 Objective c 中为自己编写一个简单的计时器程序。计时器正确倒计时,但我得到了死亡的旋转风车。我怎样才能让风车消失?我认为这是因为我有一个无限循环,但必须有办法绕过它。

我有一个在按钮单击时触发的 IBAction(按钮为启动)。从那里,它调用另一个函数来完成这项工作。

这是我的 IBAction:

- (IBAction)timerStart:(id)sender {
    self.timerDidPause = NO;
    [self timerRunning];
}

这是 timerRunning:

- (void)timerRunning {
for (;;) {
    usleep(1000000);
    if (self.timerDidPause == YES) {

    }
    else {
        if (self.seconds == 0) {
            if (self.minutes == 0) {
                [self timerDone];
                break;
            }
            else {
                self.seconds = 59;
                self.minutes = self.minutes - 1;
                [self formatTimerLabel:self.hours :self.minutes :self.seconds];
            }
        }
        else {
            self.seconds = self.seconds - 1;
            [self formatTimerLabel:self.hours :self.minutes :self.seconds];
        }
    }
}
}

在这个函数中,函数 formatTimerLabel 被调用,所以这里是:

- (void)formatTimerLabel:(int)hours
                    :(int)minutes
                    :(int)seconds {
NSString *minuteString = [[NSString alloc] init];
NSString *secondString = [[NSString alloc] init];
if (minutes < 10) {
    minuteString = [NSString stringWithFormat:@"0%d", minutes];
}
else {
    minuteString = [NSString stringWithFormat:@"%d", minutes];
}
if (seconds < 10) {
    secondString = [NSString stringWithFormat:@"0%d", seconds];
}
else {
    secondString = [NSString stringWithFormat:@"%d", seconds];
}
[self.timerLabel setStringValue:[NSString stringWithFormat:@"%d:%@:%@", hours, minuteString, secondString]];
[self.timerLabel display];
}
4

1 回答 1

7

您正在导致 UI 线程与您的循环一起挂起。几秒钟后,操作系统将光标切换到风车。

您需要查看Timer Programming Guide来安排计时器在 UI 线程之外运行NSTimer

于 2013-06-21T18:46:59.443 回答