2016-04-03 33 views
1

在我的应用程序中,我需要使用标签显示文本。值由用户提供,并用于确定每次文本更改之间的延迟。每次标签更新时,其文本都会成为我阵列中的下一个项目。但是,当它在应用程序中使用时,标签会在几秒后变为数组中的最后一个项目(延迟时间乘以数组中项目的数量)。我也打印这个项目,但是在几秒钟后(延迟时间乘以数组中项目的数量)一次打印所有项目。那么,是否有一种方法可以在每次更改后更新标签,而不是在最后更改?标签文本在功能上多次更改,但屏幕上未更新

是导致问题的代码:

@IBAction func startEndTouch(sender: AnyObject) { 

    var wordsPerMinVal:Double = 60.0/sliderValueBen 

    for item in textEnterGo { 
     delay(wordsPerMinVal){ 
      self.yourWordsLabel.text = item 
      print(item) 
     } 
    } 
} 

回答

0

您需要了解事件循环用于更新UI的方式,以及如何你的代码插入到循环。

当您的代码获取控件时,屏幕呈现将停止以让您的代码进行所需的任何更新。一旦你的代码返回,Cocoa分析你的方法中所做的更改,并相应地更新视觉效果。

这提供了解决您的问题的关键:Cocoa在您的方法结束之前无法看到任何更改,包括for循环。这就是为什么你只看到最新的更新,而中间更新没有被注意到。

为了解决这个问题,你需要重新思考这个方法:不要使用循环,而是使用一个方法来保持其状态在成员变量中。从事件处理程序中调用该方法,为第一个显示设置状态,显示第一个项目,设置计时器在wordsPerMinVal中唤醒您,然后返回。这将让事件循环呈现您的更改。当计时器回叫您时,请更改视觉效果,根据需要重新设置计时器,然后再次返回。继续,直到完成更新。