我正在研究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!
答案 0 :(得分:1)
您已正确设置了射击方法,但计时器实际上并未触发。作为mentioned by Darren,您希望使用scheduledTimerWithTimeInterval
构造函数而不是timerWithTimeInterval
构造函数,除非您专门调用[NSTimer fire]
,否则不会触发。
所以,只需为此输出旧的构造函数:
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
然后计时器应该正常启动(每秒)并调用相关的方法:
答案 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];