iPhone:如何编码减少倒数计时器?

Mit*_*cob 3 nstimer ios4

我想用一个UILabel从5开始的倒数计时器,每秒减1,如:

5 4 3 2 1

最后在标签达到0时隐藏标签.

我尝试使用它进行编码,NSTimer scheduledTimerWithTimeInterval但失败了.

请帮我.

CHa*_*ett 8

我只是在做那样的事情.我的代码中有一个名为timeReamin的UILabel.它每秒更新一次,直到达到0,然后显示警报.我必须警告你,由于计时器与你的UI在同一个线程上运行,你可能会遇到一些抖动.我还没有解决这个问题,但这适用于简单的计时器.这是我正在使用的代码:

- (void)createTimer {       
    // start timer
    gameTimer = [[NSTimer timerWithTimeInterval:1.00 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES] retain];
    [[NSRunLoop currentRunLoop] addTimer:gameTimer forMode:NSDefaultRunLoopMode];
    timeCount = 5; // instance variable
}

- (void)timerFired:(NSTimer *)timer {
    // update label
    if(timeCount == 0){
        [self timerExpired];
    } else {
        timeCount--;
        if(timeCount == 0) {
            // display correct dialog with button
        [timer invalidate];
        [self timerExpired];
         }
    }
    timeRemain.text = [NSString stringWithFormat:@"%d:%02d",timeCount/60, timeCount % 60];
}


- (void) timerExpired {
   // display an alert or something when the timer expires.
}
Run Code Online (Sandbox Code Playgroud)

找出一个消除抖动的线程解决方案.在viewDidLoad方法或applicationDidFinishLaunching中,您需要一行如下:

[NSThread detachNewThreadSelector:@selector(createTimer) toTarget:self withObject:nil];
Run Code Online (Sandbox Code Playgroud)

这将使用createTimer方法启动一个线程.但是,您还需要更新createTimer方法:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
// start timer
gameTimer = [[NSTimer timerWithTimeInterval:1.00 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES] retain];
[[NSRunLoop currentRunLoop] addTimer:gameTimer forMode:NSDefaultRunLoopMode];
[runLoop run];
[pool release];
Run Code Online (Sandbox Code Playgroud)

大多数是标准的线程入口例程.该池用于线程使用的托管内存策略.如果您使用垃圾收集,则不需要这样做,但它不会受到伤害.runloop是一个事件循环,连续执行以在每秒经过一段时间后生成事件.主线程中有一个自动创建的runloop,这是一个特定于此新线程的runloop.然后注意最后有一个新的声明:

[runLoop run];
Run Code Online (Sandbox Code Playgroud)

这可确保线程无限期执行.您可以管理计时器,例如重新启动计时器或将其设置为其他方法中的不同值.我在我的代码中的其他位置初始化我的计时器,这就是为什么该行已被删除.