创建多个NSTimers倒计时

时间:2014-05-13 12:59:07

标签: ios objective-c timer

我正在尝试为自己创建一个简单的倒数计时器应用程序。到目前为止,我已经想出了如何创建倒数计时器,对它们进行停止/重置动作,我已经连接到计时器上。

但是,我想在同一页面添加多个计时器,我不知道如何为计时器拨打额外的电话。每个计时器都有自己的倒数(一分钟为7分钟,另一分钟为3分钟等)。这些是用户无法更改的设置间隔。谷歌并没有真正为我做过如何做到这一点所以我希望有人能够至少引导我朝着正确的方向前进。以下是我的代码片段:

ViewController.h

@interface ViewController : UIViewController {
    IBOutlet UILabel *firstCountdownLabel;
    NSTimer *firstCountdownTimer;
    bool timerActive;
    int secondsCount;
}

- (IBAction)start:(id)sender;
- (void)timerRun;

@end

ViewController.m

@interface ViewController ()

@end

@implementation ViewController

- (void) timerRun {
    secondsCount = secondsCount - 1;
    int minutes = secondsCount / 60;
    int seconds = secondsCount - (minutes * 60);

    NSString *timerOutput = [NSString stringWithFormat:@"%2d:%.2d", minutes, seconds];
    firstCountdownLabel.text = timerOutput;

    if (secondsCount == 0) {
        [firstCountdownTimer invalidate];
        firstCountdownTimer = nil;
    }
}

//- (void) setTimer {
- (IBAction)start:(id)sender {
    secondsCount = 420;
    if (timerActive == NO) {
        timerActive = YES;
    self->firstCountdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerRun) userInfo:nil repeats:YES];
}
    else {
        timerActive=NO;
        [self->firstCountdownTimer invalidate];
        self->firstCountdownTimer = nil;
    }
    }

- (void)viewDidLoad
{
    [super viewDidLoad];
//    [self setTimer];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

2 个答案:

答案 0 :(得分:1)

Google无法向您展示如何实施原始应用创意。

如果需要多个计时器,请定义多个计时器实例变量:

@interface ViewController : UIViewController 
{
    IBOutlet UILabel *timer1Label;
    IBOutlet UILabel *timer2Label;
    IBOutlet UILabel *timer3Label;
    NSTimer *timer1;
    NSTimer *timer2;
    NSTimer *timer3;
    int timer1Count;
    int timer2Count;
    int timer3Count;
    bool timer1Active;
    bool timer2Active;
    bool timer3Active;
}

然后为每个启动每个计时器的按钮创建一个单独的IBAction:

- (IBAction)startTimer1:(id)sender 
{
    timer1Count = 420;
    if (timer1Active == NO) 
    {
        timer1Active = YES;
   timer1 = [NSTimer scheduledTimerWithTimeInterval:1.0 
              target:self 
              selector:@selector(timer1Run:) 
              userInfo:nil 
              repeats:YES];
    }
    else 
    {
        timer1Active=NO;
        [timer1 invalidate];
        timer1 = nil;
    }
}

- (void) timer1Run: (NSTimer*) timer
{
    timer1Count -= 1;
    int minutes = timer1Count / 60;
    int seconds = timer1Count - (minutes * 60);

    NSString *timerOutput = [NSString stringWithFormat:@"%2d:%.2d", minutes, seconds];
    timer1Label = timerOutput;

    if (timer1Count == 0) {
        [timer2 invalidate];
        timer2 = nil;
    }
}

使用“timer2”和“timer3”代替“timer1”复制每个定时器的上述代码。将每个时间计数更改为所需的值。 (我将名称从“firstTimer”更改为“timer1”,因为编辑代码更容易支持多个计时器。

我没有为你编写每个方法的3个版本,因为你需要弄清楚这个而不是复制&粘贴你不理解的代码。

有可能,并且需要更少的代码,对所有启动计时器按钮使用相同的IBAction方法,并让代码检查按钮上的标签以决定启动哪个计时器。

代码可能如下所示:

- (IBAction)startTimer1:(id)sender 
{
  int tag = [sender tag];
  switch (tag)
  {
  case 1: //timer 1
    //Put code to start timer 1 here
    break;
  case 2: //timer 2
    //put code to start timer 2 here
    break;
  }
} 

但目前这可能有点过头了。

顺便说一下,忘了你曾经看过“自我>变量”语法。它比直接引用实例变量更慢,更容易出错。使用object->变量语法还允许您访问其他对象的实例变量,这是不好的做法。您应始终使用属性来访问除您自己之外的对象的实例变量。

此外,计时器方法应该采用单个参数,一个计时器。我更正了上面代码中的计时器方法。

答案 1 :(得分:1)

创建一个类YourTimer,其中包含少量属性,如

NSString *timerLabel;
NSTimer *timer;
NSInteger timerCounter;

现在创建一个YourTimer个对象的数组。然后您可以轻松访问它。

这将是模块化,可维护和可重复使用的代码,稍后您需要再与identifier一起使用所有计时器,因此将它们包装在一个类中并使用它。