在我的tic tac toe游戏中按“再次播放”按钮后,我们可以重置每个按钮。
当我这样做时:
for var i = 1; i < 9; i++
它不会崩溃,但除了我的左上角按钮外,它会隐藏所有内容。
当我这样做时
for var i = 0; i < 9; i++
崩溃并指示EXC_BAD_INSTRUCTION
显然断点在这里:
if (gameState[sender.tag]==0 && winner == 0) {
这是playAgainPressed动作
@IBAction func playAgainPressed(sender : AnyObject) {
goNumber = 1
winner = 0
gameState = [0, 0, 0, 0, 0, 0, 0, 0, 0]
label.center = CGPointMake(label.center.x - 400, label.center.y)
playAgain.alpha = 0
var button : UIButton
for var i = 0; i < 9; i++ {
button = view.viewWithTag(i) as UIButton
button.setImage(nil, forState: .Normal)
}
}
0x108b7d350:ud2
if (gameState[sender.tag]==0 && winner == 0) {
有什么想法吗?
我将标签更改为100,101等
@IBAction func buttonPressed(sender: AnyObject) {
if (gameState[sender.tag]==0){
var image = UIImage()
if (goNumber%2==0){
image = UIImage(named: "o")!
gameState[sender.tag]==2
}else{
image = UIImage(named: "x")!
gameState[sender.tag]==1
}
goNumber++
sender.setImage(image, forState: .Normal)
}
}
提供此错误
致命错误:数组索引超出范围 (lldb)
它又称它为EXC_BAD_INSTRUCTION。我不知道它有什么问题。
if(gameState [sender.tag] == 0)
这表明出现了问题。它将此部分标记为绿色,并将其命名为EXC_BAD_INSTRUCTION ..
答案 0 :(得分:0)
最好的猜测是,您有多个带有标记值0的视图,因为它是默认值。所以你可能得到的视图不是Button
。或者可能不存在。
viewWithTag
返回一个Optional,你没有测试nil。不要忽略对Optionals的测试,不要只是添加一个明确的解包,只会抛出Optional protectctions。
使用标签时请避免使用0.更好的是使用更大的标签,例如:100,101,102 ......
答案 1 :(得分:0)
你可能已经有了
@IBOutlet弱变量按钮:UIButton!
这段代码对我有用:
button.setImage(nil, forState: .Normal)
for var i = 1; i < 9; i++ {
button = view.viewWithTag(i) as UIButton
button.setImage(nil, forState: .Normal)
}
如果我使用相同的警告开始使用i = 0
,应用程序会一直崩溃所以我只是将按钮图像重置为nil而没有带标记0的按钮标记。我是iOS编程和Swift的新手只是一个修复,而不是一个真正的程序员&#39;解决方案,但希望它有所帮助。