如何通过发送者以外的标签调用特定的 UIButton?

How to call a specific UIButton by tag other than the sender?

在一个简单的记忆游戏中,我有一个结构体,它定义了被点击的两张牌,returns 在变异函数中,整数 firstFlippedCard 和 secondFlippedCard。

如果这些与另一张 属性 不匹配,我希望两张卡都 'flip back'。我为此制作了一个过渡功能 - 但是,我只能使用以下逻辑使最后点击的按钮切换回来:

    @IBAction func cardsPress(_ sender: UIButton) {

        flip(sender: sender)

        if cardBrain.checkFirstCard(card: sender.tag - 1) == true {
            //stay flipped
        } else if cardBrain.checkForMatch(card: sender.tag - 1).match == true {
            //stay flipped
        } else {
            DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute:  {
                self.backFlip(sender: sender)
            })
        }


    }

请注意,多个 UIButton 链接到 cardsPress。我怎样才能让他们都翻回去而不是只有发件人?

添加 属性 以跟踪按下的 previousButton。然后使用这个 属性 翻转当前的 senderpreviousButton。最后,在翻转或决定保持翻转后将 previousButton 设置回 nil

var previousButton: UIButton?
var waitForFlip = false

@IBAction func cardsPress(_ sender: UIButton) {

    // ignore button input while waiting for cards to unflip
    guard !waitForFlip else { return }

    flip(sender: sender)

    if cardBrain.checkFirstCard(card: sender.tag - 1) {
        //stay flipped
        previousButton = sender
    } else if cardBrain.checkForMatch(card: sender.tag - 1).match  {
        //stay flipped
        previousButton = nil
    } else {
        waitForFlip = true
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute:  {
            self.backFlip(sender: sender)
            if let button = previousButton {
                self.backFlip(sender: button)
                self.previousButton = nil
            }
            self.waitForFlip = false
        })
    }

}

备注:

  • 玩家有可能在之前的卡片翻转回来之前开始翻转另一张卡片。我引入了一个 waitForFlip 属性 来忽略按钮输入,同时我们正在等待不匹配的卡片翻转回来,以避免 previousButton 被设置然后被 nil 覆盖的问题前一个unflip.

  • 无需检查 Bool 值是否为 == true。只需检查 if boolValue { 而不是 if boolValue == true。我删除了两个实例。

  • 您可能希望禁用已翻转卡片的按钮(设置 sender.isEnabled = false)以防止玩家选择翻转的卡片。请记住在将它们的 isEnabled 属性设置为 true.

  • 后再次启用它们