更新 Label.text setNeedsDisplay() 不起作用 - Swift

Posted

技术标签:

【中文标题】更新 Label.text setNeedsDisplay() 不起作用 - Swift【英文标题】:Update Label.text setNeedsDisplay() not working - Swift 【发布时间】:2015-07-12 06:23:23 【问题描述】:

我有一个复杂的计算表,一年中的每一天都在循环。在每天的循环结束时,我想更新屏幕。这些都是 myLabel.text 输出。 view.setNeedsDisplay() 不起作用。我需要在外部调用它还是使用其他东西?例如

for var day = 1; day < 366; day++ 
     dayLabel.text = String(format: "%i", day)
     view.setNeedsDisplay()

【问题讨论】:

您应该不需要那里的 setNeedsDisplay - 更改标签文本应该足以触发视图更改。这是 Swift 的一个添加寻找循环 - 除非你知道更好地尝试 'for day in 1...365 ' 按下按钮时调用此函数 (IBAction)。基本上你必须强制显示更新,否则它只会在循环完成时更新。 view.setNeedsDisplay 和 testLabel.setNeedsDisplay() 不这样做。在 Cocoa 中,这种方法是曲折的: [self performSelectorOnMainThread:@selector(updateDisplayEnergySunEquator:) withObject:[NSNumber numberWithDouble:distanceFromSun] waitUntilDone:YES]; 好的。你能确认“for循环”的Objective C风格在Swift中有效吗?它实际上循环了 365 次? 如果我输入一个 NSLog() 行,那么 NSLog 会实时打印。然而,UILabel 仅在循环结束时更新。 好的,所以这一切都是红鲱鱼 - 对此感到抱歉。所以也许是线程问题或只是速度问题,如大纲in this SO answer? 【参考方案1】:

从上面的评论讨论中,我们认为只需要将标签更改强制到主线程上。迅速:

dispatch_async(dispatch_get_main_queue()) 
     dayLabel.text = String(format: "%i", day)

或者使用更多的 Swift 表示法:

for day in 1...365 
    dispatch_async(dispatch_get_main_queue()) 
        dayLabel.text = "\(day)"
    

【讨论】:

同样的,只有在循环结束时更新。这是我使用的代码:@IBAction func calculatePower(sender: AnyObject) for day in 1...365 // 循环结束时更新显示 dispatch_async(dispatch_get_main_queue()) self.dayLabel.text = "(day )" 抱歉,在 *** 中发表评论时不知道如何保留布局状态。一切都在一条连续的线上。 @EdwardHasted 我现在所能想到的就是 0 到 365 循环会发生得非常快,也许所有这些变化都只是堆积起来,只有最后一个被看到。断点可能会产生误导,因为这会停止主线程,从而停止更新。 确实如此。我通常在运行测试以检查确切原因时将数字更改为 36500 ;-) Ali - 我将以不同的形式重新发布这个问题,并添加更多代码,然后删除这个问题,因为它没有得出结论。非常感谢您的帮助和耐心。

以上是关于更新 Label.text setNeedsDisplay() 不起作用 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

更新 Label.text setNeedsDisplay() 不起作用 - Swift

Kivy Label.text 属性不会在 UI 上更新

在 Swift 中以编程方式访问和更新 stackview 中的 label.text 或其他 UILabel 属性

从 UI 线程强制 GUI 更新

更新查询无法正常工作c#winform

如何通过python函数更新文本标签