当我按下一个按钮时我的游戏崩溃了(以 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 类型的未捕获异常终止)的主要内容,如果未能解决你的问题,请参考以下文章

当我按下一个按钮时,“不幸的是我的应用程序已停止”[重复]

当我按下购物车按钮时,我的应用程序崩溃了

当我按下 ENTER 时如何重新开始我的游戏?

mp.stop() 问题

Unity 中的 Google Admob 崩溃修复?

当我按下要检查的项目中的按钮以删除此项目时,如何自动选择正确的列表框项目?