【问题标题】:Objective C - loop to change label textObjective C - 循环更改标签文本
【发布时间】:2011-06-12 22:43:50
【问题描述】:

我有一个看起来像这样的循环

for(int x=0; x < 10; x++){
    [testLabel setText:[self randomString]];
    sleep(1);
}

randomString 是一种从数组中返回随机字符串的方法。

我正在使用睡眠,因此实际上可以看到标签正在更改。

循环工作正常,但标签仅在循环的最后一次迭代后更新。

有人知道为什么会这样吗?有没有办法解决它?

【问题讨论】:

标签: objective-c loops text label


【解决方案1】:

不要调用 sleep()

肯定不会在主线程上使用,在辅助线程中使用 sleep 通常是非常值得怀疑的。

在这种情况下,只需使用 NSTimer 实例来定期更新值(如 Wilbur 所说)。

【讨论】:

    【解决方案2】:

    UI 仅在运行循环结束时更新,您的循环在其中一次迭代中运行。您应该改用NSTimer

    【讨论】:

      【解决方案3】:

      要获得更新,您应该单独运行它:

      for(int x=0; x < 10; x++){
          [self performSelectorOnMainThread:@selector(updateLabel) withObject:nil waitUntilDone:NO];
          sleep(1);
      }
      
      - (void) updateLabel {
          [testLabel setText:[self randomString]];
      }
      

      【讨论】:

      • 假设循环在主线程上运行,这将有同样的问题,因为 sleep() 调用会阻止回调执行任何操作,直到为时已晚。
      【解决方案4】:

      最好在后台线程上运行字符串

      [self performSelectorInBackground:@selector(updateBusyLabel:) withObject:[NSString stringWithFormat:@"Processing ... %i",iteration]];
      
      -(void)updateBusyLabel:(NSString *)busyText {
          [_busyLabel setText:busyText];
      }
      

      我不会使用 sleep(),而且计时器工作量太大。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 2018-07-31
        • 2017-03-22
        相关资源
        最近更新 更多