倒计时器

时间:2009-06-23 14:06:23

标签: objective-c cocoa

我正在尝试创建一个倒计时器,它将倒计时,一个连接到文本字段的IBOutlet,从60秒降低到0.我不确定

一个。如何将重复限制为60和

B中。如何提前减少倒计时时间:

- (IBAction)startCountdown:(id)sender
{
    NSTimer *countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self     selector:@selector(advanceTimer:) userInfo:nil repeats:YES];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:countdownTimer forMode:NSDefaultRunLoopMode];
}

- (void)advanceTimer:(NSTimer *)timer
{
    [countdown setIntegerValue:59];
}

2 个答案:

答案 0 :(得分:19)

到目前为止,你的方向正确。

坚持使用您已有的代码,以下是advanceTimer方法应该如何使其工作:

- (void)advanceTimer:(NSTimer *)timer
{
    [countdown setIntegerValue:([countdown integerValue] - 1)];
    if ([countdown integerValue] == 0)
    {
        // code to stop the timer
    }
}

修改 为了使整个事物更加面向对象,并避免每次都从字符串转换为数字并返回,我会做这样的事情:

// Controller.h:
@interface Controller
{
    int counter;
    IBOutlet NSTextField * countdownField;
}
@property (assign) int counter;
- (IBAction)startCountdown:(id)sender;
@end

// Controller.m:
@implementation Controller

- (IBAction)startCountdown:(id)sender
{
    counter = 60;

    NSTimer *countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1
                                         target:self
                                       selector:@selector(advanceTimer:)
                                       userInfo:nil
                                        repeats:YES];
}

- (void)advanceTimer:(NSTimer *)timer
{
    [self setCounter:(counter -1)];
    [countdownField setIntegerValue:counter];
    if (counter <= 0) { [timer invalidate]; }
}

@end

并且,如果您可以使用绑定,则只需将文本字段的intValue绑定到counter的{​​{1}}属性即可。这样您就可以省略类界面中的ControllerIBOutlet中的setIntegerValue:行。

更新:删除了将计时器添加到运行循环两次的代码。感谢Nikolai Ruhe和nschmidt注意到这个错误。

更新:根据nschmidt,使用advanceTimer方法简化代码。

编辑错误定义(void)advanceTimer:(NSTimer *)计时器...导致恼人的'无法识别的选择器发送到实例'异常

答案 1 :(得分:6)

您可以添加实例变量int _timerValue来保存计时器值,然后执行以下操作。另请注意,您正在创建的NSTimer已在当前运行循环中安排。

- (IBAction)startCountdown:(id)sender
{
    _timerValue = 60;
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(advanceTimer:) userInfo:nil repeats:NO];
}

- (void)advanceTimer:(NSTimer *)timer
{
    --_timerValue;
    if(self.timerValue != 0)
       [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(advanceTimer:) userInfo:nil repeats:NO];

    [countdown setIntegerValue:_timerValue];
}