在重新加载SKScene之前尝试使用removeAllChildren()和removeAllActions()时创建的致命错误

时间:2018-08-28 18:29:47

标签: ios swift sprite-kit

这是我关于堆栈溢出的第一个问题,是的。无论如何,我试图为我的SKScene创建一个“重新加载”按钮。为此,我创建了一个名为“ EDSpriteNodeButton”的新SKSpriteNode子类。在此子类文件中,我创建了一个协议,因此可以从场景中访问方法。这是我的协议代码:

protocol EDSpriteNodeButtonDelegate: AnyObject {
func spriteNodeButtonPressed(_ button: EDSpriteNodeButton)
}    

然后我回到我的关卡场景并添加了我的自定义委托...

class Level1Scene: SKScene, SKPhysicsContactDelegate, EDSpriteNodeButtonDelegate {

然后,将我的SKSpriteNode(用作按钮的类)的类设置为“ EDSpriteNodeButton”,从我的按钮中创建一个var,然后将其设为childNode,并在其底部调用我的方法我的班级。

var reloadSceneButton = EDSpriteNodeButton()

reloadSceneButton = self.childNode(withName: "reloadSceneButton") as! EDSpriteNodeButton
reloadSceneButton.isUserInteractionEnabled = true
reloadSceneButton.delegate = self

func reloadSceneRequested(_ button: EDSpriteNodeButton) {
    self.removeAllChildren()
    self.removeAllActions()
    self.scaleMode = .aspectFill
    self.scene?.view?.presentScene(self, transition: SKTransition.fade(withDuration: 1.0))

但是当调用reloadSceneRequested()时,出现致命错误:

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

有人知道如何让我的SKScene完全重新加载(例如,这是第一次运行)吗?

1 个答案:

答案 0 :(得分:1)

  1. 检查childNode(withName:)方法的返回类型,确定它没有返回EDSpriteNodeButton类型,并且您正在将其强制转换为EDSpriteNodeButton类型。
  2. 不要强行强制转换childNode(withName:)的结果,而要在此处放一个保护。