6

我一直在尝试通过使用 让计时器显示在我的应用程序的左下角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++;
}

计时器实际上可以工作,但我无法通过按钮触发它。我试图让计时器继续,而不是在进入下一个故事板/xib 文件时在 1 处重新启动。

4

2 回答 2

11

要在按钮按下时实现计时器操作,您需要将其编写为IBAction如下方法:

- (IBAction) buttonPress
{
    NSTimer *aTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aTime) userInfo:nil repeats:YES];
}

要存储以前的值,您可以使用NSUserDefaultsSQLite 数据库。为此,我会建议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];
}
于 2012-09-21T16:53:55.217 回答
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 声明为单例的属性,然后将观察者添加到 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];
}
于 2012-09-21T16:48:47.150 回答