Динамическое обновление UILabel - PullRequest
0 голосов
/ 14 июня 2011

У меня вопрос по поводу UILabels.Я даже не уверен, что это правильный способ осуществить это, но я пытаюсь обновить UILabel для отображения двух чисел от 0 до 24, затем вернуться к нулю и снова отобразить последовательность чисел.Подвох в том, что нужно обновлять UILabel каждые 1/24 секунды.Вот код, который у меня есть ...

-(void)viewDidLoad {
fpsTimer = [NSTimer scheduledTimerWithTimeInterval: .01 target: self selector: @selector(updateFpsDisplay) userInfo: nil repeats: YES];
}

- (void)updateFpsDisplay {
    for (int i=0; i<100; i++) {
        NSLog(@"%d", i%24);
        [timecodeFrameLabel setText:[NSString stringWithFormat:@"0%d", i%24]];
    }
}

Этот код успешно печатает числа 1-24 в цикле в консоли во время выполнения, однако UILabel с именем timecodeFrameLabel просто показывает03 и не меняется.

Есть предложения?

1 Ответ

5 голосов
/ 14 июня 2011

Здесь есть две проблемы. Во-первых, ваш -updateFpsDisplay метод повторяет цикл от 0 до 99, каждый раз меняя метку в цикле. Однако метка фактически не будет перерисована, пока управление не вернется в цикл выполнения. Таким образом, каждые 0,01 секунды вы меняете метку 100 раз, а затем дисплей обновляется один раз. Избавьтесь от цикла и пусть ваш таймер сообщит вам, когда обновлять метку, а когда вы это сделаете, обновите ее только один раз. Вы захотите взять переменную-счетчик i и сделать ее переменной экземпляра (возможно, с более описательным именем), а не локальной переменной для этого метода.

- (void)updateFpsDisplay {
    // the ivar frameCount replaces i
    [timecodeFrameLabel setText:[NSString stringWithFormat:@"0%d", frameCount%24]];
}

Вторая проблема заключается в том, что 100 не кратно 24. Когда вы говорите 99% 24 == 3, именно поэтому ваш лейбл всегда говорит «3». После того, как вы изменили свой код, как описано выше, добавьте проверку к вашему методу -updateFpsDisplay, чтобы frameCount сбрасывался каждый раз, когда он достигает 0, например:

if (frameCount % 24 == 0) {
    frameCount = 0;
}

Это не позволит frameCount стать настолько большим, что в какой-то момент он перевернется.

...