试图做一个简单的倒计时应用程序,但计数器不倒计时?

时间:2015-02-05 03:31:40

标签: ios objective-c iphone xcode nstimer

我正在研究Xcode 6并尝试制作一个简单的倒计时应用。 我的应用程序非常简单。 UI具有标签和按钮。单击按钮时,它应从10开始倒计时。

这是我的代码:

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController

{
    NSInteger count;
    NSTimer *timer;
}

@property (weak, nonatomic) IBOutlet UILabel *timerLabel;

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

-(IBAction)start {
    count = 10;
    timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
};

-(void)timerFired:(NSTimer *)timer {
    count -=1;
    self.timerLabel.text = [NSString stringWithFormat:@"%i",count];

    if (count == 0) {
        [timer invalidate];
    }

}
- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end

程序编译得很好但是当我点击按钮开始倒计时时没有任何反应。我哪里做错了?

编辑:非常感谢!问题解决了。我花了3个小时试图弄清楚我做错了什么才发现这是一个愚蠢的错误。 AGH。 爱你stackoverflow!

3 个答案:

答案 0 :(得分:1)

您已正确设置了射击方法,但计时器实际上并未触发。作为mentioned by Darren,您希望使用scheduledTimerWithTimeInterval构造函数而不是timerWithTimeInterval构造函数,除非您专门调用[NSTimer fire],否则不会触发。

所以,只需为此输出旧的构造函数:

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];

然后计时器应该正常启动(每秒)并调用相关的方法:

enter image description here

答案 1 :(得分:0)

你应该使用这个NStimer初始方法。

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

代码中的主要问题是

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

没有将你的计时器添加到runloop中,所以你的计时器在一次调用后立即释放。并且scheduledTimerWithTimeInterval方法为你运行了runloop。

答案 2 :(得分:0)

在代码中替换此行

timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];

这一行

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];