【问题标题】:swift 2 fatal error: unexpectedly found nil while unwrapping an Optional value - Category Nameswift 2 致命错误:在展开可选值时意外发现 nil - 类别名称
【发布时间】:2016-07-19 21:36:31
【问题描述】:

我在以下代码中不断收到“致命错误:在展开可选值时意外发现 nil”

let ballCategoryName =  "ball"


class GameScene: SKScene, SKPhysicsContactDelegate {
    override func didMoveToView(view: SKView) {

    let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    borderBody.friction = 0
    self.physicsBody = borderBody


    let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode
    ball.position = CGPointMake(self.size.width / 2, self.size.height / 2)
    ball.physicsBody?.dynamic = true
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)
    ball.physicsBody!.applyImpulse(CGVector(dx: 2.0, dy: -2.0))

    self.addChild(ball)

错误出现在 “let ball = childNodeWithName(ballCategoryName) as!SKSpriteNode” 想知道是否有人可以帮助我了解为什么会出现这种情况

【问题讨论】:

标签: swift swift2 categories child-nodes


【解决方案1】:

您必须将该球创建为节点。你可以像这样制作一个节点:

让球 = SKSpriteNode(imageNamed: "fileimage.png")

然后将其添加到场景中。

问题是你从无到有创造了那个球。 如果您尚未创建该场景,您将不会在下面找到任何内容。那个孩子不存在。

childNodeWithName(ballCategoryName) as! SKSpriteNode

【讨论】:

    【解决方案2】:

    问题是你在这条线上强制转换不安全:

    let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode
    

    childNodeWithName() 方法返回 sprite kit 节点或 nil (SKSpriteNode?)。感叹号:as! SKSpriteNode 表示您确定此返回不为零,并且您想将其转换为非可选的SKSpriteNode。您似乎遇到了 childNodeWithName(.. 返回 nil 的情况,因此强制转换失败并且您的应用程序崩溃了。

    您可以通过多种方式打开可选项,例如,如果您使用if let,您的代码将如下所示:

    if let ball = childNodeWithName(ballCategoryName) {
        ball.position = CGPointMake(self.size.width / 2, self.size.height / 2)
        ball.physicsBody?.dynamic = true
        ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)
        ball.physicsBody!.applyImpulse(CGVector(dx: 2.0, dy: -2.0))
        self.addChild(ball) 
    }
    

    请注意,在此示例中,如果 childNodeWithName(ballCategoryName) 返回 nil,则 if 子句主体中的代码根本不会运行。

    请参阅apple docs 以获得关于您可能解开可选值的所有方式的非常全面的说明。

    或者,正如其他答案所表明的那样,您可以使用let ball = SKSpriteNode(imageNamed: "something.png") 将球实例化为 SKSpriteNode 的非可选实例

    【讨论】:

      【解决方案3】:

      你应该替换这个

      let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode
      

      有了这个

      let ball = SKSpriteNode(imageNamed: "YOUR_IMAGE_NAME")
      

      我还建议你阅读SpriteKit Programming Guide

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 2015-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多