2017-12-27 335 views
0

我試圖有一個函數,將循環通過一個數組的Ints,併爲每個項目,根據它的值,彈出一個特定的消息一秒鐘或所以,然後讓消息消失,然後移動到數組中的下一個項目。我能夠弄清楚如何使用DISPATCH爲消息消失創建一個「延遲」 - 但我仍然終止於所有消息立即彈出。Swift循環通過數組之間暫停

另外,我創建了一個名爲「offAll()」的函數,用於關閉所有消息,我試圖在for循環結束時使用DISPATCH調用 - 但正如我所說的,它仍然顯示所有消息一次。 (我也嘗試將DISPATCH語句分別放入每個case語句中,但這似乎也沒有幫助。)

僅供參考,我在XCode中使用Swift 4。謝謝!!

func popUp(){ 
    for item in order{ 
     if item == 0 { 
      firstLabel.text = "ME!" 
     } else if item == 1 { 
      secondLabel.text = "ME!" 
     } else if item == 2 { 
      thirdLabel.text = "ME!" 
     } else { 
      fourthLabel.text = "ME!" 
     } 
     DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 
      self.offAll() 
     } 

    } 
+1

在函數的開始處放置一個斷點並逐步完成,直到結束。它應該希望能夠讓你清楚爲什麼它們都出現在一次。 –

+1

另一個有用的想法。如果你有4個彈出窗口說「我!」,你可能應該讓標籤文字在這四個中的每一箇中說出不同的東西 - 這有助於排除其他問題。 – dfd

回答

2

消息顯示在一起,因爲for循環不是異步的,並且您沒有暫停它。解決方案可能是使用定時器延遲每條消息。 您可以在任何想要開始顯示消息的位置調用此計時器。 我假設訂單是一個數組。

var item = 0 
    let popUpTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { timer in 
     //removes all popups 
     self.offAll() 
     if item == 0 { 
      firstLabel.text = "ME!" 
     } else if item == 1 { 
      secondLabel.text = "ME!" 
     } else if item == 2 { 
      thirdLabel.text = "ME!" 
     } else { 
      fourthLabel.text = "ME!" 
     } 
     item = item + 1 
     if item >= order.count { //not order.count - 1 so the last popup can be removed 
      //stops the timer when all popups are shown 
      timer.invalidate() 
     } 
    }) 

這將顯示每秒彈出並刪除前一個顯示下一個之前。

+0

非常感謝!這非常有幫助! –