NSTimer Секундомер - PullRequest
       32

NSTimer Секундомер

0 голосов
/ 13 февраля 2012

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

Как мне это сделать?

ОК добавил код

код:

UILabel *stopWatchLabel;

NSTimer *stopWatchTimer; // Store the timer that fires after a certain time
NSDate *startDate; // Stores the date of the click on the start button

@property (nonatomic, retain) IBOutlet UILabel *stopWatchLabel;

- (IBAction)onStartPressed:(id)sender;
- (IBAction)onStopPressed:(id)sender;

.m

- (void)viewDidUnload
{
[self setStopWatchLabel:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (void)updateTimer
{
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
NSString *timeString=[dateFormatter stringFromDate:timerDate];
stopWatchLabel.text = timeString;
}

- (IBAction)onStartPressed:(id)sender {
startDate = [NSDate date];

// Create the stop watch timer that fires every 10 ms
stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                                  target:self
                                                selector:@selector(updateTimer)
                                                userInfo:nil
                                                 repeats:YES];
}

- (IBAction)onStopPressed:(id)sender {
[stopWatchTimer invalidate];
stopWatchTimer = nil;
[self updateTimer]; 
}

Ответы [ 5 ]

1 голос
/ 13 февраля 2012

Ну, это останавливается, потому что вы высвобождаете представление, в котором оно живет, когда выталкиваете его из стека.Вы пытались создать класс секундомера, который обрабатывает таймер независимо от вида?

0 голосов
/ 02 декабря 2013

Не знаю, проблема уже решена или нет, но все же. Создайте объект NSTimer в классе делегата приложения, а затем создайте экземпляр таймера в файле .m делегата приложения, чтобы ваш NSTimer оставался в памяти. и когда вы хотите остановить или приостановить таймер, вы можете просто сделать этот объект недействительным из любого контроллера представления.

0 голосов
/ 13 февраля 2012

Да, что все остальные говорят. На ViewDidUnload это освобождает его. Это означает, что он в основном завершает операцию, как только этот ViewController завершается.

0 голосов
/ 13 февраля 2012

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

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

стиль MVC!

0 голосов
/ 13 февраля 2012

Секундомер останавливается, потому что вы освобождаете вид, управляющий им.

Вам необходимо убедиться, что NSTimer не связан ни с одним видом.Возможно, вы можете использовать подпредставления или контроллеры модального представления ( Я думаю, что это может работать ), чтобы не выпускать секундомер при просмотре.

Вы также можете попробовать отправить информацию о секундомере вследующий вид через переменные, а затем другой вид взять секундомер оттуда.

Наиболее точно есть и другие методы.

В любом случае, вам нужно сделатьубедитесь, что NSTimer не освобожден.

...