使用NSTimer for MM:SS:HS?

时间:2012-03-12 10:34:22

标签: xcode ios5 xcode4.2 nstimer nstimeinterval

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

这是我在模拟器中的项目

simulator

当我按下开始时它开始,当我按下停止它停止,当它停止它将重置 但是当它开始并且我按下复位时它没有任何反应它不会重置启动时基本上你必须停止然后重置是方式,这或我需要添加代码任何地方继承我的代码副本。< / p>

#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];
}

我真的很欣赏它。感谢。

1 个答案:

答案 0 :(得分:2)

首先,当showActivity达到baseDate时,由于start方法未保留[NSDate date],因此EXC_BAD_ACCESS会崩溃。 baseDate会返回一个自动释放的对象,因此start方法后baseDate的引用将无效。

我建议将retain更改为start属性,然后使用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标签以显示格式化。< / p>

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

time方法中,您希望计时器开始显示自按下重置时刻起所经过的时间。计时器已在运行,因此您无需重新启动它。设置baseDate标签文本不起作用,因为当已经运行的计时器再次触发时,它将计算从time.text起的经过时间,这仍然是原始开始时间,然后设置time.text基于此。因此,不要设置baseDate,而是设置-(IBAction)reset { self.baseDate = [NSDate date]; }

{{1}}