在for()循环中更新UILabel

时间:2011-06-15 20:20:12

标签: objective-c

我有一个带for()循环的方法。在该循环中,mylabel.text会多次更新。但是,在方法完成之前,实际标签不会在屏幕上更新,使用for()循环中创建的最后一个值进行更新。

使用NSLog,它在for()循环的中间进行更新,我看到标签的值确实多次改变。

iOS中的一般做法是不在for()循环中更新标签吗?我想有办法做到这一点。

3 个答案:

答案 0 :(得分:14)

您可以通过告诉运行循环如下运行来进行UI更新:

for (NSInteger i = 0; i < 10; i++) {
    [label setText:...];
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}

答案 1 :(得分:8)

从我之前的评论:

  

请注意,此(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秒。它可以适应各种其他要求,而无需在主运行循环上创建阻塞方法。

答案 2 :(得分:-2)

[yourLabel setNeedsDisplay];