显示在视图控制器之间保留的iOS应用程序的计时器

时间:2012-09-21 16:03:03

标签: ios objective-c cocoa-touch nstimer

我一直在尝试使用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重启。

2 个答案:

答案 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];
}