Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在didMove范围之外添加子项_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios 在didMove范围之外添加子项

Ios 在didMove范围之外添加子项,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,据我所知,我在使用swift 3时遇到了一个非常不寻常的问题。我正在创建一个SpriteKit iOS游戏。问题在于SKSpriteNode。我通过创建节点 var游戏背景:SKSpriteNode 它位于类的内部。然后在didMove()函数中初始化节点,如下所示 override func didMove(to view: SKView) { gameOverBackground = SKSpriteNode.init(texture: SKTexture(image

据我所知,我在使用swift 3时遇到了一个非常不寻常的问题。我正在创建一个SpriteKit iOS游戏。问题在于
SKSpriteNode
。我通过创建节点

var游戏背景:SKSpriteNode

它位于类的内部。然后在
didMove()
函数中初始化节点,如下所示

override func didMove(to view: SKView) {        
    gameOverBackground = SKSpriteNode.init(texture: SKTexture(image: #imageLiteral(resourceName: "UIbg")), size: CGSize(width: (self.scene?.size.width)! / 1.5, height: (self.scene?.size.height)! / 1.5))
    gameOverBackground.position = CGPoint(x: 0, y: 0)
    gameOverBackground.zPosition = 10
    gameOverBackground.name = "GameOverBackground"
}
func didBegin(_ contact: SKPhysicsContact) {

    if (contact with many nodes) {
        self.addChild(self.gameOverBackground)
    }
}
现在,当我稍后尝试将节点作为子节点添加到场景中时,问题出现了。我这样做是在一个接触函数中

override func didMove(to view: SKView) {        
    gameOverBackground = SKSpriteNode.init(texture: SKTexture(image: #imageLiteral(resourceName: "UIbg")), size: CGSize(width: (self.scene?.size.width)! / 1.5, height: (self.scene?.size.height)! / 1.5))
    gameOverBackground.position = CGPoint(x: 0, y: 0)
    gameOverBackground.zPosition = 10
    gameOverBackground.name = "GameOverBackground"
}
func didBegin(_ contact: SKPhysicsContact) {

    if (contact with many nodes) {
        self.addChild(self.gameOverBackground)
    }
}
我不断得到节点等于
nil
的错误。我找到了一个解决方法,只需在
didMove()
中添加子节点并将其隐藏即可。然后当接触发生时,让它不被隐藏;但我更好奇的是为什么会出现这个问题,以及我是否做错了什么

提前谢谢

我找到了一个解决方法,只需在didMove()中添加子节点并将其隐藏即可。然后当接触发生时,让它不被隐藏;但我更好奇的是为什么会出现这个问题,以及我是否做错了什么

这意味着您的节点在didMove中并非为零,但在您的联系人代理出现时,沿途的某个地方已变为零

以下是您的代码示例,只是稍微简化了一点:

var node: SKSpriteNode!

override func didMove(to view: SKView) {
  node = SKSpriteNode(color: .blue, size: CGSize(width: 25, height: 25))
}

// Touchesbegan on ios:
override func mouseDown(with event: NSEvent) {
  addChild(node)
}
代码运行正常,当您单击屏幕时,节点出现

touchesbeated/didbeagin不会有什么不同

问题是,在代码的某个地方,节点被设置为nil

下面是一个如何实现的示例:

// Touchesended on ios:
override func mouseUp(with event: NSEvent) {
  node.removeFromParent() // or, node = nil
  addChild(node) // crash!!
}

我认为您得到了错误,因为您将节点声明为
var gameOverBackground:SKSpriteNode此处隐式展开可选变量,当您在contact函数中使用此函数时,您的节点为nil,因此会抛出节点等于nil的错误,要消除此错误,您应该将变量声明为非可选变量,如
var gameOverBackground=SKSpriteNode()
或类似于此,如果您希望它是可选的
var gameOverBackground:SKSpriteNode?=SKSpriteNode()
或者干脆
var gameOverBackground:SKSpriteNode?
但在这种情况下,它仍然是零,但不会crash@3stud1ant3您的建议可能有效,但您的推理是错误的:(
只是告诉编译器“程序员在使用时将确保此值不是零”允许他们在其他地方对其进行初始化。问题是,尽管在中进行了初始化,但节点为nildidMove@Fluidity谢谢你的意见,我会记住的