我一直在尝试使用NSTimer
在我的应用的左下角显示一个计时器,并在左下角显示“已用时间”显示为UILabel
但它并没有为我工作。
-(void)viewDidLoad
{
NSTimer *aTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aTime) userInfo:nil repeats:YES];
}
-(void)aTime
{
NSLog(@"....Update Function Called....");
static int i = 1;
Label.text = [NSString stringWithFormat:@"%d",i];
i++;
}
计时器确实可以正常工作,但我无法通过按钮触发它。我正在尝试让计时器继续运行,而不是在进入下一个storyboard / xib文件时从1重启。
答案 0 :(得分:11)
要在按下按钮时实现计时器操作,您需要在IBAction
方法上编写它,例如:
- (IBAction) buttonPress
{
NSTimer *aTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aTime) userInfo:nil repeats:YES];
}
要存储以前的值,可以使用NSUserDefaults
或SQLite数据库。为此,我建议NSUserDefaults
。
更改aTime方法,如:
-(void)aTime
{
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
id obj = [standardUserDefaults objectForKey:@"TimerValue"];
int i = 0;
if(obj != nil)
{
i = [obj intValue];
}
Label.text = [NSString stringWithFormat:@"%d",i];
i++;
[standardUserDefaults setObject:[NSNumber numberWithInt:i] forKey:@"TimerValue"];
[standardUserDefaults synchronize];
}
答案 1 :(得分:3)
我认为问题是方法aTime
在你的视图控制器中,当你进入另一个视图时,这个视图控制器被释放,你不能再执行选择器aTime了。
所以我建议你将aTime
方法和i
放到一个单例(或者当你进入另一个视图时不会释放的任何对象)并将单例设置为你的目标计时器。
此外,您应该在视图控制器中保留以下代码,以便在返回此视图时可以正确更新标签。
-(void)viewDidLoad
{
NSTimer *aTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aTime) userInfo:nil repeats:YES];
}
-(void)aTime
{
NSLog(@"....Update Function Called....");
Label.text = [NSString stringWithFormat:@"%d",theSingleton.i];
}
更好的选择:
您可以将i声明为您的单身人士的属性,然后向我添加一个观察者,然后您将按时更新您的标签。 当你想要计算时间时调用-startTimer。
单身人士:
@interface Singleton
@property (nonatomic,retain) NSNumber *i;
@end
@implementation
+(Singleton*)instance
{
//the singleton code here
}
-(void)startTimer
{
NSTimer *aTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aTime) userInfo:nil repeats:YES];
}
-(void)aTime
{
NSInteger temp = [i integerValue];
temp ++;
self.i = [NSNumber numberWithInteger:temp];
}
视图控制器:
-(void)viewDidLoad
{
[super viewDidLoad];
[[Singleton instance] addObserver:self forKeyPath:@"i" options:NSKeyValueObservingOptionNew context:NULL]];
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
NSLog(@"....Update Function Called....");
Label.text = [NSString stringWithFormat:@"%@",[Singleton instance].i];
}