Используя NSTimer для MM: SS: HS? - PullRequest
0 голосов
/ 12 марта 2012

Я создал NSTimer в Xcode 4.2, и он работает, но у меня одна проблема.

вот мой проект в симуляторе

simulator

когда я нажимаю старт, он запускается, а когда я нажимаю стоп, он останавливается, а когда он останавливается, он сбрасывается. но когда он запускается, и я нажимаю «сброс», когда ничего не происходит, он не сбрасывается, когда запускается, в основном, вы должны остановить, тогда сброс - это способы, или мне нужно добавить код, где бы ни была копия моего кода.

#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 Ответ

2 голосов
/ 12 марта 2012

Во-первых, вышеприведенное должно завершиться с EXC_BAD_ACCESS, когда оно достигнет showActivity, так как baseDate не сохраняется в методе start.[NSDate date] возвращает объект автоматического освобождения, поэтому 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 вы устанавливаете baseDate на текущее время (вы не устанавливаете time.text), а затем запускаете таймер.Затем метод showActivity продолжит работу и установит time.text.

В методе reset вы хотите, чтобы таймер начал показывать истекшее время с момента нажатия сброса момента.Таймер уже работает, поэтому вам не нужно перезапускать его.Установка текста метки time не работает, потому что когда снова запускается уже работающий таймер, он вычислит истекшее время из baseDate, который по-прежнему является исходным временем запуска, а затем установит time.text на основании этого.Поэтому вместо настройки time.text установите baseDate:

-(IBAction)reset {
    self.baseDate = [NSDate date];
}
...