在循环 iPhone 应用程序期间取消隐藏并从按钮获取输入

Unhide and get input from button during while loop iPhone app

提问人:Andrew Wertheim 提问时间:4/17/2023 最后编辑:HangarRashAndrew Wertheim 更新时间:4/18/2023 访问量:34

问:

我正在 Swift for iPhone 中与人类和计算机玩家一起构建投注功能。我为投注过程开始一个 while 循环,遍历每个玩家。如果是电脑玩家,则调用自动投注函数。如果是人类玩家,我想取消隐藏操作按钮(下注、检查、弃牌等)并等待用户的输入,然后再继续下注循环。(简化代码如下)出于某种原因,取消隐藏按钮永远不会执行,即使成功打印了取消隐藏后的打印语句也是如此。此外,while 循环似乎跳过等待用户输入,然后再继续。构建它以实现我想要做的事情的“正确”方法是什么?

感谢您的任何帮助/见解。

listOfPlayers = [computer1, player1, computer2]

while !bettingRoundComplete {
    for player in listOfPlayers {
        if player == computer1 {
            autoBet()
        }
        if player == player1 {
            betButton.isHidden = false
            checkButton.isHidden = false
            var playerFinishedTurn = false
            while !playerFinishedTurn {
                  // wait for player to enter input via buttons (which should be unhidden but are not)
                  // do some things with input
                  // flip playerFinishedTurn flag to true
        }
        if player == computer2 {
            autoBet()
        }
        // if bettingRoundComplete, exit loop (global variable flag triggered within betting functions that are called during while loop execution)
    }
}
iOS Swift 异步 UIKIT

评论

0赞 Joakim Danielson 4/18/2023
你在什么上下文中调用此代码,其中的异步部分在哪里?当用户按下betButton时,有什么理由不直接为电脑玩家运行autoBet吗?
0赞 Andrew Wertheim 4/18/2023
是的,用户下注取决于电脑玩家选择做什么,并且每轮下注顺序都会发生变化。问题在于,该程序基本上只是跳过等待玩家输入,而是转到列表中的下一个玩家。我不确定为什么会这样
0赞 Joakim Danielson 4/18/2023
那是因为你正在循环所有玩家。计算机操作是单独的事件,需要自行处理。

答:

1赞 Duncan C 4/18/2023 #1

你对事件驱动应用的工作原理有一个基本的误解。你的应用会收到有关用户操作等事件的通知,运行你的代码以响应该操作,然后返回并等待其他事情发生。你不能有一个等待用户操作的 while 循环,因为当你是你的 while 循环时,你不会让用户响应。您需要重构代码,使其像状态机一样进入“收集用户输入”模式。