【问题标题】:UILabel Display not updateUILabel 显示不更新
【发布时间】:2013-07-02 15:09:56
【问题描述】:

我想编写一些代码来使 UILabel 文本在文本发生更改时更新。我正在写一个小演示,例如:

- (IBAction)ButtonPressed:(id)sender {
    for(int i = 0; i < 100000; ++i)
    {
        [self.Label setText:[NSString stringWithFormat:@"%d",i]];
        [self.Label setNeedsDisplay];
    }
}

当我单击按钮时,标签仅更改一次为 99999,但我希望它从 0 到 99999 显示 99999 次。有人知道为什么代码不起作用吗?

提前致谢!

【问题讨论】:

    标签: iphone ios objective-c uilabel setneedsdisplay


    【解决方案1】:

    setNeedsDisplay 告诉系统您的视图想要被绘制,但它不会强迫它发生。在for 循环完成之后,将在下一个绘制周期重新绘制视图。如果您希望所有 100,000 个更改都可见,则必须将标签更新延迟人类可感知的量。

    【讨论】:

    • 这是正确的。在 iOS 中绘图不会实时发生。绘制发生在您的方法完成并且您进入主循环之后。
    • 谢谢,这完全正确。我需要设置0.1s左右的延迟时间,效果很好。
    【解决方案2】:

    上面的答案是正确的,但要详细说明,如果你确实想明显地更新标签的内容,你可以试试下面的

    - (IBAction)ButtonPressed:(id)sender {
        for(int i = 0; i < 100000; ++i)
        {
            double delayInSeconds = 0.01 * i;
            dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds *     NSEC_PER_SEC));
            dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
                [self.Label setText:[NSString stringWithFormat:@"%d",i]];
                [self.Label setNeedsDisplay];
            }); 
        }
    }
    

    不过,出于您的目的,这可能无关紧要。一种更具触觉的方法是将按钮按下的次数存储在实例变量中,并在每次触摸时递增,并适当地设置标签值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多