我已经在Xcode 4.2中创建了一个NSTimer,它可以工作,但我遇到了这个问题。
这是我在模拟器中的项目
当我按下开始时它开始,当我按下停止它停止,当它停止它将重置 但是当它开始并且我按下复位时它没有任何反应它不会重置启动时基本上你必须停止然后重置是方式,这或我需要添加代码任何地方继承我的代码副本。< / 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];
}
我真的很欣赏它。感谢。
答案 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}}