【问题标题】:Update Label.text setNeedsDisplay() not working - Swift更新 Label.text setNeedsDisplay() 不起作用 - 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

标签: swift setneedsdisplay


【解决方案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 )" } } }
  • 抱歉,在 StackOverflow 中发表评论时不知道如何保留布局状态。一切都在一条连续的线上。
  • @EdwardHasted 我现在所能想到的就是 0 到 365 循环会发生得非常快,也许所有这些变化都只是堆积起来,只有最后一个被看到。断点可能会产生误导,因为这会停止主线程,从而停止更新。
  • 确实如此。我通常在运行测试以检查确切原因时将数字更改为 36500 ;-)
  • Ali - 我将以不同的形式重新发布这个问题,并添加更多代码,然后删除这个问题,因为它没有得出结论。非常感谢您的帮助和耐心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
相关资源
最近更新 更多