Swift 4 - while 循环和 UI 元素

Swift 4 - while loops and UI elements

-- 编辑--

我无法回答我自己的问题,但我会在这次编辑中留下我的解决方案。

感谢大家花时间看我的问题。

我正在创建 1 个新变量

var 定时器 = 1

我在我的异步调度计时器中使用它几秒钟,并且每轮将它递增 1 以 space 序列出来,这花了很多思考,但这解决了我的问题。

我希望按顺序播放按钮,然后解决方案是根据以下调整调度计时器。

谢谢大家的评论,让我有了不同的想法,帮助我解决了问题。


我是编程和 Swift 的新手,一直在尝试制作一个小程序,但我一直被循环问题难倒,我真的是 swift 的新手,并且已经尝试过"for loop"、repeat-while、while 循环等。我遇到的问题是我正在尝试获取 4 个 UI 元素 "Alphas" 以按创建新值但当前的顺序进行更改它似乎发生得如此之快,以至于所有 4 个按钮同时闪烁。

我正在做的是有 4 个彩色图块,我使用随机生成的单值数组,并且在循环的每次传递中我将新生成的数组值 "newChallenge" 附加到一个名为"challenge" 用户需要输入才能从游戏中获得正确的结果。

我试图添加回放,有一个函数叫做 "showChallenge",我将 newChallenge 值转换为一个整数并使用一个开关,希望每个按钮都按照创建 newChallenge 的顺序闪烁.然而,我得到的是所有 4 个图块都会同时闪烁,我尝试使用异步在它们之间创建一个时间,但我遗漏了一些东西。有人可以让我知道如何处理这个问题或告诉我我的代码哪里出错了吗?

还有一些其他变量,但它们是不言自明的,如果有人能帮助我,那就太好了。这是我的第一个 Swift 程序,虽然它很有趣,但我花了很多时间来解决这个问题。如果能得到任何帮助,我将不胜感激:)

func challenges() {
    var low = 1
    var high = 5

    while low != high {
        newChallenge = [Int.random(in: 1..<5)]
        showChallenge()
        challenge.append(contentsOf: newChallenge)
        low += 1
     }
     tmpChallenge.text = "Array: \(self.challenge)" //debugging
}

func showChallenge () {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        self.uTurnPrompt.isHidden = false
        self.low = 1
    }        
    var btnFeedback = newChallenge[indexElement]
    uTurnPrompt.isHidden = true

    switch ("JRSM" == "JRSM") {
        case btnFeedback == 1:
            print("num1")
            self.btn_Num1.alpha = 0.1
            DispatchQueue.main.asyncAfter(deadline: .now() + (btnSpeed)) {
                self.btn_Num1.alpha = 1
            }
            break;
        case btnFeedback == 2:
            print("num2")
            self.btn_Num2.alpha = 0.1
            DispatchQueue.main.asyncAfter(deadline: .now() + (btnSpeed)) {
                self.btn_Num2.alpha = 1
            }
            break;
        case btnFeedback == 3:
            print("num3")
            self.btn_Num3.alpha = 0.1
            DispatchQueue.main.asyncAfter(deadline: .now() + (btnSpeed)) {
                self.btn_Num3.alpha = 1
            }
            break;
        case btnFeedback == 4:
            print("num4")
            self.btn_Num4.alpha = 0.1
            DispatchQueue.main.asyncAfter(deadline: .now() + (btnSpeed)) {
                self.btn_Num4.alpha = 1
            }
            break;
        default:
            break;
        }

    infoText.isHidden = false
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        self.infoText.isHidden = true
    }
}

问题是您在循环中调用 showChallenge。一切都是同步调用的,所以看起来它们都是在同一时间被调用的。

修改循环中的调用 showChallenge,根据您调用它的顺序将其包装在延迟中,如下所示:

DispatchQueue.main.asyncAfter(deadline: .now() + low) {
    showChallenge()
}