gpt4 book ai didi

ios - 导航时保持计时器在另一个页面上运行

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:31 24 4
gpt4 key购买 nike

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

Storyboard截图:

到目前为止的代码:

//
// 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 是 View Controller 类的成员变量。我假设当你在 View 之间切换时,你正在破坏这个 View Controller 并实例化一个新的实例。这意味着这个 View Controller 和计时器都不见了;这并不是说计时器正在重置,而是您的旧计时器已被销毁,正在创建一个新计时器。

您需要的是将 NSTimer 及其功能存储在每次更改 View Controller 时都不会被破坏的地方。一种解决方案是创建一个处理计时器的单例类。 (单例类是一种只能创建一次的类;它只能存在一个实例。您可以阅读更多关于它们的信息 here。)

这是一个示例,说明如何在 Objective-C 中创建单例类。 header :

//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 类导入到您的 View Controller 类中,并且您的 View Controller 方法将更改为:

-(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] 更简洁:)

关于ios - 导航时保持计时器在另一个页面上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18026723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com