Не удается обновить текст в UILabel - PullRequest
3 голосов
/ 26 февраля 2010

Я создал свой ViewController из UIViewController, где добавляю UILabel as; @property (nonatomic, retain) UILabel * progressLabel;

Я инициализирую эту метку в loadView

- (void)loadView {

 // Set main view to View Controller
 UIView* localView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] ];
 self.view = localView;
 [localView release];

 // Set progress label
 self.progressLabel =  [[UILabel alloc] initWithFrame:CGRectMake(0, 420, 320, 20) ];
 [self.progressLabel setFont:[UIFont fontWithName:@"Georgia" size:12]]; 
 [self.progressLabel setTextColor:[UIColor whiteColor]];
 [self.progressLabel setBackgroundColor:[UIColor blackColor]];
 [self.view addSubview:self.progressLabel];

}

И у меня есть метод, который должен обновить текст метки

-(void) doSomethig {
 for(int i = 0; i < 10; i++) {
  NSString* str = [NSString stringWithFormat:@"%d", i];
  [self.progressLabel setText:str];
  [self.progressLabel.superview setNeedsDisplay];
  NSLog(@"%@", self.progressLabel.text);
  sleep(1);
 }
}

Почему этот код не обновляет свойство progressLabel.text? Однако в консоли отладчика я вижу следующий текст:

2010-02-26 14:21:55.707 iLabelUpdate[6272:207] 0
2010-02-26 14:21:56.708 iLabelUpdate[6272:207] 1
2010-02-26 14:21:57.708 iLabelUpdate[6272:207] 2
2010-02-26 14:21:58.709 iLabelUpdate[6272:207] 3
2010-02-26 14:21:59.709 iLabelUpdate[6272:207] 4
2010-02-26 14:22:00.710 iLabelUpdate[6272:207] 5
2010-02-26 14:22:01.710 iLabelUpdate[6272:207] 6
2010-02-26 14:22:02.711 iLabelUpdate[6272:207] 7
2010-02-26 14:22:03.711 iLabelUpdate[6272:207] 8
2010-02-26 14:22:04.711 iLabelUpdate[6272:207] 9

А когда цикл закончится, я вижу "9" в метке прогресса?

Ответы [ 3 ]

3 голосов
/ 26 февраля 2010

Цикл Run обновляет пользовательский интерфейс. Вы можете попробовать вызвать runloop в цикле for:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
2 голосов
/ 26 февраля 2010

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

Попробуйте использовать NSTimer, и в -timerDidFire: обновите метку один раз соответственно.

1 голос
/ 26 февраля 2010

Пользовательский интерфейс обновляется в главном цикле выполнения пользовательского интерфейса приложения. Не в данный момент вы устанавливаете свойство текста. Поэтому, пока вы находитесь в цикле, пользовательский интерфейс не будет обновляться. После выхода из функции пользовательский интерфейс будет обновлен.

Лучше было бы использовать NSTimer для выполнения метода каждую 1 секунду. Тогда ваш интерфейс будет обновлен правильно.

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