2016-04-03 51 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中喚醒您,然後返回。這將讓事件循環呈現您的更改。當計時器回叫您時,請更改視覺效果,根據需要重新設置計時器,然後再次返回。繼續,直到完成更新。