在导航时保持定时器在另一个页面上运行
当你切换到其他页面并完成其他任务时,我试图保持一个计时器在另一个页面上运行,本质上保持一个时钟,以执行任务需要多长时间。 每当我切换到另一个页面时,它将定时器重置为启动的时间,并且对于我试图保留的其他页面上的某些开关也是如此。 有任何想法吗?
故事板的屏幕截图:
目前代码:
// // 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
你的NSTimer是你的视图控制器类的成员variables。 我假设,当你切换视图之间,你正在销毁这个视图控制器,并实例化一个新的实例。 这意味着这个视图控制器不见了,以及计时器; 这并不是定时器被重置,而是你的旧定时器已经被破坏,正在创build一个新的定时器。
您需要将NSTimer及其function存储在每次更换视图控制器都不会被破坏的位置。 一个解决scheme是创build一个处理定时器的Singleton类。 (一个Singleton类是一个只能创build一次的类,只能存在一个,可以在这里阅读。
这里是一个如何在Objective-C中创build一个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
方法时,将创buildApplicationManager的实例。 每次你想访问它,再次调用instance
方法; ApplicationManager将被返回。 现在,您只需将您的NSTimer(以及您希望在整个应用程序中保留的任何其他对象)添加为ApplicationManager类的成员variables即可。
然后,您必须将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]
现在,不必在任何地方input[ApplicationManager instance]
,而只需将其引用为APPMGR
。 [APPMGR ticker]
比[[ApplicationManager instance] ticker]
:)更清洁