IOS停止倒数计时器为0

时间:2014-11-05 21:16:39

标签: ios objective-c timer

我是一名新程序员(我自己学习目标-c)。我正在尝试制作一个将使用倒数计时器作为主视图的iPad应用程序,然后使用警报根据我从数据库中提取的不同数据进入不同的视图。我已经工作了几天,我不能让这个计时器停在0并触发警报,允许用户进入下一个视图。它已启用ARC。

这里是.h:

的代码
    #import <UIKit/UIKit.h>

@interface ViewController : UIViewController{
    int eventTime;
    NSDate *eventDate;


    IBOutlet UILabel *timerLabel;

    NSTimer *timer;


}
-(void)updateCountDown;
-(void)exercisePopup;



@end

而对于.m:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

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

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCountDown) userInfo:nil repeats:YES];
    if(![timerLabel isEqual: 0]) {
        [timer invalidate];
        [self exercisePopup];
    }


}


- (void)updateCountDown {

    eventTime = 10;
    eventDate = [NSDate dateWithTimeIntervalSinceNow:eventTime];

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    int units = NSCalendarUnitHour | NSCalendarUnitMinute| NSCalendarUnitSecond;

    NSDateComponents *components = [calendar components:units fromDate:[NSDate date] toDate: eventDate options:0];

    [timerLabel setText:[NSString stringWithFormat:@"%ld%c:%ld%c:%ld%c", (long)[components hour], 'h', (long)[components minute], 'm', (long)[components second], 's']];


}

-(void)exercisePopup{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Time to Exercise" message:@"It's Time to Exercise, Touch the Screen" delegate:self cancelButtonTitle:@"Touch to Exercise" otherButtonTitles:nil];
    // optional - add more buttons:
    [alert show];
}



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

@end

我遇到的问题是让此计时器停在0以便警报响起。如果我离开!在if语句中,当应用程序打开时,警报会立即触发,但倒计时永远不会启动。如果我把它拿出来,倒计时会永远变成负数等等。我不确定if语句检查是什么,因为它似乎认为timerLabel从0开始。我还尝试移动if语句,甚至将其作为自己的方法然后在计时器加载后尝试调用它,但我尝试过的任何工作都没有。

我完全迷失了,我已经尝试了过去几天我在这里找到的所有解决方案,而且没有一个能够解决我想做的事情,我&# 39;当我实施它们时,我们遇到了各种各样的错误。如果有人有任何建议,我真的很感激。

3 个答案:

答案 0 :(得分:0)

if(![timerLabel isEqual: 0]

这一行是你的问题。您正在将UILabel与0进行比较,这与检查此UILabel是否为nil相同,而不是viewDidLoad,因为您正在从存在此标签的nib文件中加载。所以[timerLabel isEqual:0]总是等于false,这就是为什么否定整个if语句会使警报触发。你需要考虑另一种计算NSTimer射击的10次重复的方法。

尝试使用该方法中声明的updateCountDown来计算static int被解雇的次数。

答案 1 :(得分:0)

看来你在这里误解了一些事情。

计划流程

当你实例化你的计时器时,它会自行关闭,然后每隔1.0秒调用你的选择器。原始执行继续正常,检查您的状况,然后退出viewDidLoad。你永远不会再次检查病情。这是您活动的基本顺序:

  
      
  1. 您创建了一个计时器。
  2.   
  3. 您检查timerLabel是否不是0
  4.   
  5. 一秒钟之后,您的计时器会启动,执行updateCountDown
  6.   

您的exercisePopup方法永远不会被调用,因为您未在updateCountDown中检查您的状况。

对象比较

使用timerLabelisEqual:整数文字0的比较与您写的相同:

if (![timerLabel isEqual:nil]) {

这显然不是你想要的;您正尝试将与timerLabel关联的字符串值与字符串值@"0"进行比较。

if (![timerLabel.text isEqualToString:@"0"]) {

然而,这不是比较时间的最佳方式。您应该考虑使用NSTimeInterval并进行比较。您可能还希望使用CADisplayLink在显示屏上安排时间更新,以便您不会等待可能不同步的计时器。

答案 2 :(得分:0)

我把这段代码放在一个示例项目中,它可以工作。搏一搏。我对你要做的事做了一些细微的改动。你做错了几件事。检查计时器是否为0的if语句在viewDidLoadMethod期间被调用,在启动计时器后立即调用它。

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *timerLabel;
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic) NSInteger currentTime;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.currentTime = 10;
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];
}

- (void)updateTimer
{
    NSDate *eventDate = [NSDate dateWithTimeIntervalSinceNow:self.currentTime];

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    int units = NSCalendarUnitHour | NSCalendarUnitMinute| NSCalendarUnitSecond;

    NSDateComponents *components = [calendar components:units fromDate:[NSDate date] toDate: eventDate options:0];

    [self.timerLabel setText:[NSString stringWithFormat:@"%ld%c:%ld%c:%ld%c", (long)[components hour], 'h', (long)[components minute], 'm', (long)[components second], 's']];
    self.currentTime--;
    if (self.currentTime == 0)
    {
        [self.timer invalidate];
        [self exercisePopup];
    }

}
-(void)exercisePopup{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Time to Exercise" message:@"It's Time to Exercise, Touch the Screen" delegate:self cancelButtonTitle:@"Touch to Exercise" otherButtonTitles:nil];
    // optional - add more buttons:
    [alert show];
}


@end