0

我在 Xcode 4.2 中创建了一个 NSTimer,它可以工作,但我遇到了这个问题。

这是我在模拟器中的项目

模拟器

当我按开始时它开始,当我按停止时它停止,当它停止时它会重置,但是当它启动时,我按下重置时它什么也没发生,它在启动时不会重置,基本上你必须停止然后重置是方法和这个或者我是否需要在任何地方添加代码,这是我的代码的副本。

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController {

    IBOutlet UILabel *time; 

    NSTimer *myticker;

    //declare baseDate
    NSDate* baseDate; 

}

-(IBAction)stop;
-(IBAction)reset;

@end

这是我的实现

 #import "FirstViewController.h"

@implementation FirstViewController

@synthesize baseDate;


-(IBAction)start {
    [myticker invalidate];
    self.baseDate = [NSDate date];
    myticker = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showActivity) userInfo:nil repeats:YES];
}

-(IBAction)stop;{ 

    [myticker invalidate];
    myticker = nil;

}



-(IBAction)reset {
    self.baseDate = [NSDate date];
     time.text = @"00:00:0";  
}


-(void)showActivity {
    NSTimeInterval interval = [baseDate timeIntervalSinceNow];
    double intpart;
    double fractional = modf(interval, &intpart);
    NSUInteger hundredth = ABS((int)(fractional*10));
    NSUInteger seconds = ABS((int)interval);
    NSUInteger minutes = seconds/60;

    time.text = [NSString stringWithFormat:@"%02d:%02d:%01d", minutes%60, seconds%60, hundredth];
}

对此,我真的非常感激。谢谢。

4

1 回答 1

2

showActivity首先,由于baseDate没有保留在start方法 中,所以上面的内容在到达时应该与 EXC_BAD_ACCESS 一起崩溃。[NSDate date]返回一个自动释放的对象,因此baseDate在方法之后会有一个无效的引用start

我建议更改baseDate为一个retain属性,然后将其设置为startusing self.

//.h
@property (nonatomic, retain) NSDate *baseDate;

//.m
@synthesize baseDate;

-(IBAction)start {
    [myticker invalidate];
    self.baseDate = [NSDate date];
    myticker = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showActivity) userInfo:nil repeats:YES];
}


要解决此reset问题,请注意该showActivity方法采用当前值baseDate来计算经过的时间,然后设置time标签以格式化显示。

在该start方法中,您将 设置baseDate为当前时间(您没有设置time.text),然后启动计时器。然后该showActivity方法将继续触发并设置time.text

在该reset方法中,您希望计时器开始显示自按下重置时刻以来经过的时间。计时器已经在运行,因此您无需重新启动它。设置time标签文本不起作用,因为当已经运行的计时器再次触发时,它将计算baseDate仍然是原始开始时间的经过时间,然后time.text根据该时间进行设置。因此,不要设置time.text,而是设置baseDate

-(IBAction)reset {
    self.baseDate = [NSDate date];
}
于 2012-03-12T14:05:13.677 回答