在我的应用中,我需要使用标签显示文字。用户提供一个值,它用于确定每个文本更改之间的延迟。每次标签更新时,其文本都将成为我的数组中的下一个项目。但是,当它在应用程序中使用时,标签会在几秒钟后更改为数组中的最后一项(延迟时间乘以数组中的项目数量)。我也会打印该项目,但会在几秒钟后立即打印所有项目(延迟时间乘以数组中的项目数量)。那么,标签是否有一种方法可以在每次更改后更新,而不是在最后更改?
导致问题的代码:
@IBAction func startEndTouch(sender: AnyObject) {
var wordsPerMinVal:Double = 60.0/sliderValueBen
for item in textEnterGo {
delay(wordsPerMinVal){
self.yourWordsLabel.text = item
print(item)
}
}
}
答案 0 :(得分:0)
您需要了解事件循环用于更新UI的方式,以及代码如何插入循环。
当您的代码获得控件时,屏幕渲染会停止,让您的代码进行所需的任何更新。代码返回后,Cocoa会分析方法中所做的更改,并相应地更新视觉效果。
这提供了解决问题的关键:在方法结束之前,Cocoa看不到任何更改,包括for
循环。这就是为什么你只看到最后一次更新,而中间更新没有被注意到。
为了解决这个问题,你需要重新思考这个方法:而不是使用循环,创建一个方法,将其状态保存在成员变量中。从事件处理程序调用该方法,设置第一个显示的状态,显示第一个项目,设置计时器以在wordsPerMinVal
中唤醒您,然后返回。这将让事件循环呈现您的更改。当计时器回叫您时,更改视觉效果,根据需要再次设置计时器,然后再次返回。继续,直到完成更新。