Метка обновления Objective-C NSTimer не обновляется

У меня есть два метода ниже. Один метод (timerHit), который получает продолжительность трека текущей воспроизводимой песни, вычитает из него 1 и распечатывает его в журнале, а затем также обновляет метку со значением. Другой метод (countDown), который повторяется каждую секунду, вызывает метод timerHit, однако он не работает правильно, оператор NSLog работает и повторяется, таким образом печатая значение каждую секунду, но оператор метки обновления [duration setDoubleValue:trackDuration]; не работает. Может кто-нибудь помочь мне?

- (void)countDown {
    [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerHit:) userInfo:nil repeats:YES];
}

- (void)timerHit:(NSTimer *)p_timer
{
    iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
    double trackDuration = [[iTunes currentTrack] duration];
    if( trackDuration <= 1 && [p_timer isValid] )
        [p_timer invalidate];
    trackDuration--;
    NSLog(@"%d", trackDuration);
    [duration setDoubleValue:trackDuration];
}

Спасибо, Сами.


person Sami    schedule 08.02.2011    source источник


Ответы (2)


Предполагая, что продолжительность является экземпляром NSTextField (после поиска в Google это кажется так - я не могу найти NSLabel как существующий объект), попробуйте это;

[duration setStringValue:[NSString stringWithFormat:@"%d", trackDuration]];
person Moshe    schedule 08.02.2011
comment
Ха-ха, почти такой же ответ, но мне больше нравится запись через точку. :-) Примечание: таймер выполняется в основном потоке? Я ожидаю, что это требование будет выполняться в основном потоке, но для NSTimer в этом нет необходимости. Но если он работает в основном потоке, как iOS может гарантировать, что он всегда будет вызываться вовремя? Или, может быть, это просто не может гарантировать это на второй мысли. - person Krumelur; 08.02.2011
comment
Теперь он даже ничего не показывает, а также я получаю сообщение об ошибке NSTextField может не отвечать на -setText. Также извините, я забыл упомянуть, что это приложение для Mac OS X, а не для iPhone, поэтому метка является экземпляром NSTextView, а не UILabel. - person Sami; 08.02.2011
comment
i forgot to mention this is a Mac OS X app not and iPhone app so the label is an instance of NSTextView and not UILabel. А, это многое объясняет. - person Moshe; 08.02.2011

Вам нужно установить текст метки:

duration.text = [NSString stringWithFormat:@"%d", trackDuration]];
person Krumelur    schedule 08.02.2011
comment
Mac, а не iOS — так что -[NSTextField setStringValue:], а не -[UILabel setText:]. - person Jonathan Grynspan; 08.02.2011