Попытка переключить 2 NSTimers - PullRequest
0 голосов
/ 20 декабря 2010

Я пытаюсь добавить в свое приложение функцию, позволяющую пользователю переключать текущую дату, отображаемую в американском формате (ММ / ДД / ГГГГ), в британский формат (ДД / ММ / ГГГГ) и обратно.

Я использую элемент управления сегментами для переключения моей UILabel (dateSlateLabel) между двумя отдельными таймерами (dateTimer_us & dateTimer_uk).

У меня все работает, но всякий раз, когда я переключаюсь на dateTimer_uk,dateTimer_us продолжает сопротивляться, как будто я не убил его.Когда я говорю «отбиваюсь», я имею в виду, что я вижу, что британский формат с американским форматом мигает взад и вперед, основываясь на timeInterval таймеров.Так как timeInterval моих таймеров равен 0,01, я вижу быстрое мигание формата США над форматом Великобритании.Мне ясно, что dateTimer_us не является недействительным или что-то еще запускает его резервное копирование.Когда я переключаюсь на dateTimer_us, все кажется нормальным, проблема заключается в другом (когда я переключаюсь на dateTimer_uk).Я понимаю, что что-то не так в моем коде / управлении памятью, но я не могу понять это.Я просмотрел сеть и потратил два дня на эту проблему.

Есть идеи?

Примечание. Я пытался использовать только один таймер и if else, который проверял состояние сегмента контроллера для управления форматом даты, но это не помогло.

Вот мой код:

//////////////////////////////THIS CONTROLS THE DATE TIMER//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
- (IBAction)toggleDateFormat {

    if(dateFormatSegmentControl.selectedSegmentIndex == 0) {


        [dateTimer_uk invalidate];
        [dateTimer_uk release];
        dateTimer_uk = nil;

        [self dateTimer_us];


    }
    else if (dateFormatSegmentControl.selectedSegmentIndex == 1) {


        [dateTimer_us invalidate];
        [dateTimer_us release];
        dateTimer_us = nil;

        [self dateTimer_uk];


    }

}







-(void)dateTimer_us {

    dateTimer_us = [[NSTimer scheduledTimerWithTimeInterval: .01
                                                     target: self
                                                   selector: @selector(displayDate_us)
                                                   userInfo: nil
                                                    repeats: YES] retain];

}
-(void)displayDate_us; {

    NSDateFormatter *formatter =
    [[[NSDateFormatter alloc] init] autorelease];
    NSDate *date = [NSDate date];


    [formatter setDateFormat:@"MM/dd/yyyy"];
    [dateSlateLabel setText:[formatter stringFromDate:date]];



}
-(void)dateTimer_uk {


    dateTimer_uk = [[NSTimer scheduledTimerWithTimeInterval: .01
                                                     target: self
                                                   selector: @selector(displayDate_uk)
                                                   userInfo: nil
                                                    repeats: YES] retain];
}           
-(void)displayDate_uk; {

    NSDateFormatter *formatter =
    [[[NSDateFormatter alloc] init] autorelease];
    NSDate *date = [NSDate date];


    [formatter setDateFormat:@"dd/MM/yyyy"];
    [dateSlateLabel setText:[formatter stringFromDate:date]];   

}

1 Ответ

0 голосов
/ 20 декабря 2010

Дизайн, который вы здесь показали, излишне сложен.Например, вы запрашиваете интервал в одну сотую секунды, чтобы обновить метку, которая представляет текущее время.Это примерно в сто раз чаще, чем запускать.

Ваш дизайн должен выглядеть примерно так:

  • Добавьте свойство NSDateFormatter в ваш класс контроллера представления.Вам не нужно открывать это свойство публично.
  • В viewDidLoad,
    • alloc / init ваше NSDateFormatter свойство по умолчанию, в США или Великобритании (может прочитать / записать это предпочтение с NSUserDefaults.
    • Запустить таймер с интервалом в 1 секунду для вызова метода для обновления метки. Этот метод должен использовать свойство NSDateFormatter, каким бы оно ни было (метод не заботится) для отображения даты / времени
  • В вашем методе обратного вызова для переключения формата времени,
    • release свойство NSDateFormatter иalloc / init новый
  • В viewDidUnload,
    • invalidate / release NSTimer объект
...