如何通过发送者以外的标签调用特定的 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
。然后使用这个 属性 翻转当前的 sender
和 previousButton
。最后,在翻转或决定保持翻转后将 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
.
后再次启用它们
在一个简单的记忆游戏中,我有一个结构体,它定义了被点击的两张牌,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
。然后使用这个 属性 翻转当前的 sender
和 previousButton
。最后,在翻转或决定保持翻转后将 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
. 后再次启用它们