在导航时保持计时器在另一页上运行

时间:2013-08-02 21:58:27

标签: ios objective-c nstimer

当你切换到其他页面并完成其他任务时,我正试图让计时器在另一个页面上运行,本质上是保留执行任务所需的时间。每当我切换到另一个页面时,它会将计时器重置为它的启动状态,并对我正在尝试保留的其他页面上的某些开关执行相同操作。有任何想法吗?

故事板的屏幕截图:

到目前为止

代码:

//
//  ViewController.m


#import "ViewController.h"

@interface ViewController ()


@end

@implementation ViewController

- (IBAction)start{
ticker = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self    ``selector:@selector(showActivity) userInfo:nil repeats:YES];

}

- (IBAction)reset{
[ticker invalidate];
time.text = @" 0:00";
}

- (void)showActivity{
int currentTime = [time.text intValue];
int newTime = currentTime + 1;
time.text = [NSString stringWithFormat:@"%d", newTime];
}




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

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

@end

//  ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{

IBOutlet UILabel *time;
NSTimer *ticker;
}

- (IBAction)start;
- (IBAction)reset;


- (void)showActivity;
@end

1 个答案:

答案 0 :(得分:1)

您的NSTimer是视图控制器类的成员变量。我假设当您在视图之间切换时,您正在销毁此视图控制器并实例化一个新视图控制器的实例。这意味着这个视图控制器已经消失,以及计时器;并不是说计时器正在被重置,而是你的旧计时器被摧毁了,正在创建一个新计时器。

您需要的是将NSTimer及其功能存储在每次更改视图控制器时都不会被销毁的位置。一种解决方案是创建一个处理计时器的Singleton类。 (Singleton类是一个只能创建一次的类;它只能存在一个实例。你可以阅读更多关于它们的here。)

以下是如何在Objective-C中创建Singleton类的示例。标题:

//ApplicationManager.h

@interface ApplicationManager : NSObject

+(ApplicationManager*) instance;

@end

实施:

//ApplicationManager.m

#import "ApplicationManager.h"

@implementation ApplicationManager
static ApplicationManager* appMgr = nil;

+(ApplicationManager*) instance
{
    @synchronized([ApplicationManager class])
    {
        if(!appMgr)
        {
            appMgr = [[self alloc] init];
        }

        return appMgr;
    }

    return nil;
}    

+(id) alloc
{
    @synchronized([ApplicationManager class])
    {
        NSAssert((appMgr == nil), @"Only one instance of singleton class may be instantiated.");
        appMgr = [super alloc];
        return appMgr;
    }
}

-(id) init
{
    if(!(self = [super init]))
    {
        [self release];
        return nil;
    }

    return self;
}

@end

第一次调用instance方法时,将创建ApplicationManager的实例。每次要访问它时,再次调用instance方法;将返回ApplicationManager。现在,您只需将NSTimer(以及您希望在整个应用程序中保留的任何其他对象)添加为ApplicationManager类的成员变量。

然后必须将ApplicationManager类导入到视图控制器类中,并且视图控制器方法将更改为:

-(IBAction) start
{
    [[ApplicationManager instance] setTicker:[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showActivity) userInfo:nil repeats:YES]];
}

-(IBAction) reset
{
    [[[ApplicationManager instance] ticker] invalidate];
    time.text = @" 0:00";
}

-(void) showActivity
{
    int currentTime = [time.text intValue];
    int newTime = currentTime + 1;
    time.text = [NSString stringWithFormat:@"%d", newTime];
}

如果你想让事情变得美观和整洁,你也可以将这一行添加到ApplicationManager类的顶部:

#define APPMGR [ApplicationManager instance]

现在,您无需在任何地方输入[ApplicationManager instance],而只需将其称为APPMGR即可。 [APPMGR ticker][[ApplicationManager instance] ticker]更清洁:)