2011-09-30 66 views
1

我试图实现一个按钮,在随机时间段(0-10s之间)后启动一个定时器。计时器运行时,它应该每0.005秒更新一次标签以显示已经过了多长时间。我遇到的问题是2倍:等待随机时间,然后开始更新UILabel(iPhone)中的流逝时间

  1. 我不知道如何让标签更新与经过的时间每0.005秒。

  2. 我无法让应用程序在启动计时器之前等待随机时间。目前我正在使用sleep(x),但它似乎会导致应用忽略if语句中的所有其他代码,并导致按钮图像冻结(即看起来像仍然点击了它)。

这里是我到目前为止的代码...

- (IBAction)buttonPressed:(id)sender 
{ 
    if ([buttonLabel.text isEqualToString:@"START"]) 
    { 
     buttonLabel.text = @" "; // Clear the label 
     int startTime = arc4random() % 10; // Find the random period of time to wait 
     sleep(startTime); // Wait that period of time 
     startTime = CACurrentMediaTime(); // Set the start time 
     buttonLabel.text = @"STOP"; // Update the label 
    } 
    else 
    { 
     buttonLabel.text = @" "; 
     double stopTime = CACurrentMediaTime(); // Get the stop time 
     double timeTaken = stopTime - startTime; // Work out the period of time elapsed 
    } 
} 

如果任何人有..

A)任何建议,如何获得标签与经过时间更新。

B)如何修复冻结了应用

的“延迟”时期......因为我在这一点上几乎难倒这将是非常有益的。提前致谢。

+0

sleep()阻止执行 – EricLeaf

回答

3

您应该使用NSTimer来做到这一点。尝试代码:

- (void)text1; { 
    buttonLabel.text = @" "; 
} 

- (void)text2; { 
    buttonLabel.text = @"STOP"; 
} 

- (IBAction)buttonPressed:(id)sender; { 
    if ([buttonLabel.text isEqualToString:@"START"]) { 
    int startTime = arc4random() % 10; // Find the random period of time to wait 
    [NSTimer scheduledTimerWithTimeInterval:(float)startTime target:self selector:@selector(text2:) userInfo:nil repeats:NO]; 
    } 
    else{ 
    // I put 1.0f by default, but you could use something more complicated if you want. 
    [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(text1:) userInfo:nil repeats:NO]; 
    } 
} 

我不完全知道你想怎么根据时间来更新标签,但如果您发布更多的代码,或举一个例子,我会发布关于如何做的代码那样,但它也只是使用NSTimer。希望有助于!

+0

感谢您对此的帮助。我很新的iPhone开发,我不知道我完全明白scheduledTimerWithTimeInterval究竟做了什么。我查看了API描述,并且我知道它会根据提供的参数返回另一个NSTimer对象;但是我不明白如何从这个新对象中获取流逝的时间。 –

+0

所有'NSTimer'都会在指定时间后调用一个方法(@selector()中的方法)。因此,如果您想在固定时间后更新某些内容,则只需调用上述方法即可。 – msgambel

+0

感谢您的解释,我设法得到了我使用两个答案的组合后的效果! –

1

的答案,可能是:

一旦时间的随机量已经过去了,(@MSgambel有一个很好的建议),然后执行:

timer = [NSTimer scheduledTimerWithTimeInterval:kGranularity target:self selector:@selector(periodicallyUpdateLabel) userInfo:nil repeats:YES]; 

(以上线路可以进入@ MSgambel's -text2方法。)

这将每秒重复调用-periodicallyUpdateLabel方法一次。在这种方法中,你可以做更新标签,检查用户操作,或者如果时间到了或者其他条件满足,就结束游戏。

这里是-periodicallyUpdateLabel方法:

- (void)periodicallyUpdateView { 
    counter++; 
    timeValueLabel.text = [NSString stringWithFormat:@"%02d", counter]; 
} 

你必须将文本格式不同,以得到你想要的。另外,从计数器值转换为使用kGranularity的时间。但是,这是我发现的,iOS设备中只有很多CPU周期。试图降低到微秒级别使界面变得呆滞,显示的时间开始偏离实际时间。换句话说,您可能不得不将标签的更新限制为每百分之一秒或十分之一。实验。

+0

这真的很有帮助 - 谢谢。我能够结合这两个答案来获得我期待的效果。再次感谢! –