2017-12-27 340 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

非常感谢!这非常有帮助! –