我正在快速創建一個記憶游戲,用戶可以在其中選擇將在螢屏上可用的卡片數量。這個選擇是在選單視圖控制器上進行的,并且資料被傳遞到游戲視圖控制器。我使用 for 回圈創建代表游戲卡片的按鈕并將每個按鈕添加到陣列中。
但是,在啟動游戲時,根據玩家選擇的卡數量,不同數量的卡出現不正確(例如,如果選擇了8張卡,出現8張卡片。
按鈕創建功能:
func createCardButtons(){
let initialPos = Int(screenWidth/50)
var xPos = Int(screenWidth/20)
var yPos = Int(screenHeight/20)
let size = Int(screenWidth/5)
let cardBack = #imageLiteral(resourceName: "card_back")
for _ in 0...cardsNum! {
if xPos < Int(screenWidth - size) {
let button = UIButton(frame: CGRect(x: xPos, y: yPos, width: size, height: size))
button.addTarget(self, action: #selector(cardPressed), for: .touchUpInside)
button.setImage(cardBack, for: .normal)
view.addSubview(button)
buttonsArr.append(button)
xPos = size initialPos
} else {
xPos = Int(screenWidth/20)
yPos = size initialPos
}
}
print(buttonsArr)
}
列印 8 張卡片的資訊:
[<UIButton: 0x157509950; frame = (18 40; 75 75); opaque = NO; layer = <CALayer: 0x6000029dba60>>,
<UIButton: 0x157509c10; frame = (100 40; 75 75); opaque = NO; layer = <CALayer: 0x6000029dae60>>,
<UIButton: 0x157509ed0; frame = (182 40; 75 75); opaque = NO; layer = <CALayer: 0x6000029db960>>,
<UIButton: 0x15750a190; frame = (264 40; 75 75); opaque = NO; layer = <CALayer: 0x6000029dacc0>>,
<UIButton: 0x15750a450; frame = (18 122; 75 75); opaque = NO; layer = <CALayer: 0x6000029dbc20>>,
<UIButton: 0x15750a710; frame = (100 122; 75 75); opaque = NO; layer = <CALayer: 0x6000029daca0>>,
<UIButton: 0x15750a9d0; frame = (182 122; 75 75); opaque = NO; layer = <CALayer: 0x6000029dbb00>>,
<UIButton: 0x15750ac90; frame = (264 122; 75 75); opaque = NO; layer = <CALayer: 0x6000029dbcc0>>]
列印 10 張卡片的資訊:
[<UIButton: 0x15851ba30; frame = (18 40; 75 75); opaque = NO; layer = <CALayer: 0x600002057bc0>>,
<UIButton: 0x15851bcf0; frame = (100 40; 75 75); opaque = NO; layer = <CALayer: 0x600002043300>>,
<UIButton: 0x15851bfb0; frame = (182 40; 75 75); opaque = NO; layer = <CALayer: 0x60000204fba0>>,
<UIButton: 0x15851c270; frame = (264 40; 75 75); opaque = NO; layer = <CALayer: 0x60000204a340>>,
<UIButton: 0x15851c530; frame = (18 122; 75 75); opaque = NO; layer = <CALayer: 0x60000204a1a0>>,
<UIButton: 0x15851c7f0; frame = (100 122; 75 75); opaque = NO; layer = <CALayer: 0x60000206be80>>,
<UIButton: 0x15851cab0; frame = (182 122; 75 75); opaque = NO; layer = <CALayer: 0x600002061840>>,
<UIButton: 0x15851cd70; frame = (264 122; 75 75); opaque = NO; layer = <CALayer: 0x600002063a40>>,
<UIButton: 0x15851d030; frame = (18 204; 75 75); opaque = NO; layer = <CALayer: 0x600002063420>>]
如果cardNum = 8 將8 項添加到陣列中,為什么cardsNum = 10 只添加9?
uj5u.com熱心網友回復:
因為您的 for 回圈內部的else分支if-else不會創建并將 a 添加UIButton到您的陣列中,所以每當呼叫此分支時,都不會為 for 回圈的運行創建任何按鈕。
如有必要,您可以通過在回圈開始時更新來解決此問題yPos,然后無論是否yPos修改都執行按鈕創建。例如:
for _ in 0...cardsNum! {
if xPos >= Int(screenWidth - size) {
xPos = Int(screenWidth/20)
yPos = size initialPos
}
let button = UIButton(frame: CGRect(x: xPos, y: yPos, width: size, height: size))
button.addTarget(self, action: #selector(cardPressed), for: .touchUpInside)
button.setImage(cardBack, for: .normal)
view.addSubview(button)
buttonsArr.append(button)
xPos = size initialPos
}
此外,使用您使用的 for 回圈,cardNum = 8實際上應該UIButtons在陣列中產生 9(和cardNum = 1011)。
for _ in 0...cardsNum!
cardsNum 這意味著從 0 到包含運行回圈,因此包括 0 和cardsNum. 所以在這里你的回圈將被稱為cardsNum 1時間。
如果您只希望它是運行cardsNum時間,請使用半開范圍運算子:
for _ in 0..<cardsNum!
這意味著從 0 開始運行回圈,但不包括 cardsNum
(在此處查看有關 Swift 中不同范圍運算子的更多資訊。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494322.html
