【问题标题】:Swift loop through array one by one with pauses in betweenSwift 一个接一个地循环遍历数组,中间有停顿
【发布时间】:2017-12-27 14:31:32
【问题描述】:

我正在尝试创建一个函数,该函数将遍历 Ints 数组,并且对于每个项目,根据其值,弹出特定消息一秒钟左右,然后让消息消失,然后移动到数组中的下一项。我能够弄清楚如何使用 DISPATCH 为消息消失创建“延迟” - 但我仍然最终会立即弹出所有消息。

另外,我创建了一个名为“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()
        }

    }

【问题讨论】:

  • 在函数的开头放置一个断点,并单步执行直到结束。希望它可以让您清楚为什么它们会同时出现。
  • 另一个有用的想法。如果您有 4 个弹出框说“我!”,您可能应该让标签文本在这四个中中说出不同的内容 - 这有助于排除其他问题。

标签: arrays swift loops delay dispatch


【解决方案1】:

消息一起出现,因为 for 循环不是异步的,并且您没有暂停它。一个解决方案可能是使用计时器来延迟每条消息。 您可以在要开始显示消息的任何位置调用此计时器。 我假设 order 是一个数组。

    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()
        }
    })

这将每秒显示一个弹出窗口,并在显示下一个之前删除前一个。

【讨论】:

  • 非常感谢!这很有帮助!
猜你喜欢
  • 1970-01-01
  • 2013-11-06
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多