Xcode Objective-C | iOS:延迟function/ NSTimer帮助?

所以我正在开发我的第一个iOS应用程序,我需要帮助。

现在简单的程序,我有约9个button,当我按下第一个button,或任何button,我只是想第一个button高亮显示60毫秒,高亮,第二个button高亮,等待60毫秒,unighighlight等其余的button,所以它看起来像一个移动的LED。

我已经尝试了睡眠/睡眠,但是一旦睡眠持续时间结束,看起来就像是一起跳过高亮/不高亮。

例如:

- (void) button_circleBusy:(id)sender{ firstButton.enabled = NO; sleep(1); firstButton.enabled = YES; 

等等button的其余部分。 它会延迟,但不会延迟“firstButton.enabled = NO”。 我有一个每个button的“禁用状态”的图片,我从来没有看到它。

任何帮助的赞赏! 我查看了NSTimer,但是我不确定如何实现它。

谢谢。

– 保罗

sleep不起作用,因为显示只能在主线程返回到系统后才能更新。 NSTimer是要走的路。 为此,您需要实现将由定时器调用的方法来更改button。 一个例子:

 - (void)button_circleBusy:(id)sender { firstButton.enabled = NO; // 60 milliseconds is .06 seconds [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO]; } - (void)goToSecondButton:(id)sender { firstButton.enabled = YES; secondButton.enabled = NO; [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToThirdButton:) userInfo:nil repeats:NO]; } ... 
 int64_t delayInSeconds = 0.6; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ do something to the button(s) }); 

更less的代码是更好的代码。

 [NSThread sleepForTimeInterval:0.06]; 

迅速:

 Thread.sleep(forTimeInterval: 0.06) 

稍微不详细的方法是使用performSelector:withObject:afterDelay:它为您设置NSTimer对象,并且可以轻松取消

所以继续前面的例子

 [self performSelector:@selector(goToSecondButton) withObject:nil afterDelay:.06]; 

更多信息在文档中

尝试

 NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ]; [NSThread sleepUntilDate:future]; 

我想补充一下Avner Barr的答案。 当使用int64时,看起来当我们超过了1.0的值,函数似乎延迟不同。 所以我认为在这一点上,我们应该使用NSTimeInterval。

所以,最终的代码是:

 NSTimeInterval delayInSeconds = 0.05; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ //do your tasks here }); 
 [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO]; 

是最好的使用。 使用睡眠(15); 将导致用户无法执行任何其他操作。 使用以下函数,您可以用适当的select器或命令replacegoToSecondButton,这也可以来自框架。