当我按下一个按钮时我的游戏崩溃了(以 NSException 类型的未捕获异常终止)
Posted
技术标签:
【中文标题】当我按下一个按钮时我的游戏崩溃了(以 NSException 类型的未捕获异常终止)【英文标题】:My game crashes when I press a button (terminating with uncaught exception of type NSException) 【发布时间】:2017-07-26 14:19:58 【问题描述】:我在 Xcode 9.0(测试版)中制作我的游戏基本上,我试图在结束场景中获得一个按钮,以便在单击时呈现游戏场景,但是每当我单击按钮时,游戏崩溃并在控制台中显示:terminating with uncaught exception of type NSException.
谁能帮帮我!?
下面是我使用的代码。
import SpriteKit
类EndScene:SKScene
var replayButton:SKSpriteNode!
override func didMove(to view: SKView)
replayButton = self.childNode(withName: "replay") as! SKSpriteNode
replayButton.position = CGPoint(x: 0, y: 0)
replayButton.setScale(0.5)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
let touch = touches.first
if let location = touch?.location(in: self)
let nodesArray = self.nodes(at: location)
if nodesArray.first?.name == "replay"
let transition = SKTransition.push(with: .right, duration: 1)
let gameScene = GameScene(size: self.size)
self.view?.presentScene(gameScene, transition: transition)
My code for the button
这是应用崩溃时调试控制台中的所有内容:
2017-07-26 16:54:35.697622+0200 Sides[49264:5441087] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试添加已经有父节点的 SKNode:名称:'(null)' 纹理:['SidesBG1' (420 x 660)] 位置:0, 0 比例:1.00, 1.00 大小:2000, 2000 锚点:0.5, 0.5 旋转:0.00' * 首先抛出调用栈: ( 0 核心基础 0x000000010ae65c7b 异常预处理 + 171 1 libobjc.A.dylib 0x0000000106a80121 objc_exception_throw + 48 2 核心基础 0x000000010aed7a45 +[NSException raise:format:] + 197 3 SpriteKit 0x00000001077b26a1 -[SKNode insertChild:atIndex:] + 162 4 SpriteKit 0x00000001077b25de -[SKNode addChild:] + 68 5 面 0x000000010614d796 _T05Sides9GameSceneC7didMoveySo6SKViewC2to_tF + 7398 6 面 0x000000010614da2c _T05Sides9GameSceneC7didMoveySo6SKViewC2to_tFTo + 60 7 SpriteKit 0x0000000107779d2d-[SKScene _didMoveToView:] + 204 8 SpriteKit 0x0000000107799e00 -[SKView presentScene:transition:] + 347 9 面 0x0000000106156b42 _T05Sides8EndSceneC12touchesBeganys3SetVySo7UITouchCG_So7UIEventCSg4withtF + 1730 10 面 0x0000000106156dc8 _T05Sides8EndSceneC12touchesBeganys3SetVySo7UITouchCG_So7UIEventCSg4withtFTo + 104 11 SpriteKit 0x0000000107798181-[SKView touchesBegan:withEvent:] + 1130 12 UIKit 0x0000000107a5f998-[UIWindow_sendTouchesForEvent:] + 2130 13 UIKit 0x0000000107a61360 -[UIWindow 发送事件:] + 4124 14 UIKit 0x0000000107a074d2-[UIApplication sendEvent:] + 352 15 UIKit 0x0000000108306384 __dispatchPreprocessedEventFromEventQueue + 2809 16 UIKit 0x0000000108308eeb __handleEventQueueInternal + 5957 17 核心基础 0x000000010ae093a1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 18 核心基础 0x000000010adedc8f __CFRunLoopDoSources0 + 271 19 核心基础 0x000000010aded23f __CFRunLoopRun + 1039 20 核心基础 0x000000010adecbb9 CFRunLoopRunSpecific + 409 21 图形服务 0x000000010fd4d9e2 GSEventRunModal + 62 22 UIKit 0x00000001079eacb2 UIApplicationMain + 159 23 面 0x00000001061559d7 主要 + 55 24 libdyld.dylib 0x000000010bee4b95 开始 + 1 ) libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)
【问题讨论】:
可以添加堆栈跟踪吗? ...以及调试日志中的异常描述。 什么意思 这是它在调试日志中所说的:libc++abi.dylib: terminating with uncaught exception of type NSException (lldb) 你应该把你的实际代码放在问题中,而不是它的图像。欢迎来到 SO。请查看此***.com/help/how-to-ask 和此***.com/help/mcve 以获得使用此网站时的最佳效果。 【参考方案1】:尝试将 didMove 更新为以下内容
var replayButton: SKSpriteNode!
override func didMove(to view: SKView)
if (self.childNode(withName: "//replay") as? SKSpriteNode) != nil
replayButton = self.childNode(withName: "replay") as! SKSpriteNode
replayButton.position = CGPoint(x: 0, y: 0)
replayButton.setScale(0.5)
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
let touch = touches.first
if let location = touch?.location(in: self)
let nodesArray = self.nodes(at: location)
if nodesArray.first?.name == "replay"
let transition = SKTransition.push(with: .right, duration: 1)
let gameScene = GameScene(size: self.size)
self.view?.presentScene(gameScene, transition: transition)
我编辑了代码,检查它是否在没有崩溃的情况下工作并在按钮上执行操作。
【讨论】:
它仍然说 libc++abi.dylib: terminating with uncaught exception of type NSException (lldb) @YohannesGobezie 请将 touchesEnded 中的“重播”更新为“//重播” 当我这样做时,按钮不会做任何事情 @YohannesGobezie 我编辑了代码,请检查是否有效。 它仍然崩溃:(【参考方案2】:没关系,我修好了!这是因为它添加了已经存在的节点,所以我确实 removeFromParent 到我的所有对象(除了一个,它是敌人)并且它起作用了(但是当我回去时对象仍然太大,所以我确实写了这个过渡到我的 EndScene:let endScene = EndScene(fileNamed: "EndScene")
endScene!.size = self.size
endScene!.scaleMode = self.scaleMode
)。
在过渡到我的结尾场景时写了这个:let gameScene = GameScene(fileNamed: "GameScene")
gameScene!.size = self.size
gameScene!.scaleMode = self.scaleMode
)
非常感谢@Sulthan!
【讨论】:
以上是关于当我按下一个按钮时我的游戏崩溃了(以 NSException 类型的未捕获异常终止)的主要内容,如果未能解决你的问题,请参考以下文章