Во-первых, вышеприведенное должно завершиться с 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];
}