【问题标题】:Updating UILabel in a loop?循环更新UILabel?
【发布时间】:2012-01-03 02:43:03
【问题描述】:

我希望屏幕显示以下示例代码每次迭代的数字?? 无论是否使用暂停,此代码都会显示最后一次迭代次数...

for(int i = 0; i<10; i++){
    [lbl setText:[NSString stringWithFormat:@"%d", i]];
}

我在一个 while 循环中通过 TCP 套接字进行了更新...只有最后一个更新被写入屏幕...而且速度很慢,所以我应该看到所有更新。

【问题讨论】:

  • 迭代速度可能太快,您无法看到更改。
  • 您期待什么样的行为?像数到 10 需要 10 秒?
  • 这是一个例子...我可以在这里暂停一下...没有区别
  • 请您再澄清一点好吗?另外,这是否发生在主线程上? UI 元素的所有更新都必须在主线程上进行。
  • 问题是直到下一个运行循环开始时才真正对 UI 元素进行更新,直到您执行的代码完成。所以你可以随心所欲地更新文本属性,但它只会取最后一个值,除非你使用 NSTimer 或 dispatch_after。如果您正在寻找从 0 到 10 “闪烁”的快速增加的标签,请使用以下解决方案,但时间间隔要小。

标签: objective-c


【解决方案1】:

您应该设置一个计时器来处理标签的更新。现在整个循环在几分之一秒内发生。

NSTimer * aTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimerLabel) userInfo:nil repeats:YES];

-(void)updateTimerLabel {
    static int i = 0;

    [lbl setText:[NSString stringWithFormat:@"%d", i++];
}

这样你的标签应该每秒更新一次。

【讨论】:

  • 这是对的,但问题不在于它发生得太快,而是在控制权返回 UI 线程之前,对界面的更改不会出现,换句话说,直到你的代码停止做事。
  • 但他显然不在乎,上面的代码正是你要找的。​​span>
  • 如果你有一个监听 TCP 套接字的 while 循环,它应该发生在专用于它的后台线程中,让你在主线程上更新 UI。但是,您发布的代码与此无关,并且变得非常混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 2020-02-17
  • 2012-07-20
相关资源
最近更新 更多