Обновление UILabel в середине цикла for () - PullRequest
5 голосов
/ 16 июня 2011

У меня есть метод с циклом for ().В этом цикле mylabel.text обновляется много раз.Однако фактическая метка не обновляется на экране до тех пор, пока метод не будет завершен, и обновляется с использованием последнего значения, созданного в цикле for ().

Использование NSLog, который выполняет обновление в середине for (), я вижу, что значение метки действительно менялось много раз.

Является ли обычной практикой в ​​iOS, чтобы не обновлять метки в середине цикла for ()?Я бы предположил, что есть способ сделать это.

Ответы [ 3 ]

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

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

for (NSInteger i = 0; i < 10; i++) {
    [label setText:...];
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}
8 голосов
/ 02 мая 2012

Из моего предыдущего комментария:

Обратите внимание, что это (runMode:beforeDate:) может иметь все виды причудливых побочных эффектов.Когда вы вызываете runMode: beforeDate:, все может происходить в середине вашего цикла.Таймеры могли стрелять;WebKit может сделать все виды безумия;отложенные селекторы могут срабатывать.Это очень опасный трюк.Иногда полезный, иногда необходимый (особенно на Mac), но не универсальный инструмент.

Лучшее решение - запланировать обновления в основной очереди отправки:

  for (NSInteger i = 0; i < 10; i++) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, i * NSEC_PER_SEC), 
                   dispatch_get_main_queue(), ^{
      [self.label setText:[NSString stringWithFormat:@"%d", i]];
    });
  }

Это расписание 10 обновлений с интервалом в 1 секунду.Его можно адаптировать ко всем другим требованиям без создания метода блокировки в главном цикле выполнения.

0 голосов
/ 16 июня 2011

1001 * попробовать *

[yourLabel setNeedsDisplay];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...