Swift UIViewController未加载属性检查器中指定的DAE文件

Swift UIViewController未加载属性检查器中指定的DAE文件,swift,xcode6,interface-builder,scenekit,Swift,Xcode6,Interface Builder,Scenekit,我在Xcode 6.1.1上使用iOS游戏模板创建了一个新项目,选项如下: Language: Swift Game Technology: SceneKit Device: Universal 应用程序按“原样”运行正常,但现在我想直接从Xcode上的Interface Builder指定.dae文件,因此我在视图控制器中更改了如下方法: override func viewDidLoad() { super.viewDidLoad() let scnView = se

我在Xcode 6.1.1上使用iOS游戏模板创建了一个新项目,选项如下:

Language: Swift

Game Technology: SceneKit

Device: Universal
应用程序按“原样”运行正常,但现在我想直接从Xcode上的Interface Builder指定.dae文件,因此我在视图控制器中更改了如下方法:

override func viewDidLoad() {
    super.viewDidLoad()

    let scnView = self.view as SCNView

    // customize the loaded scene
    if let scene = scnView.scene {

        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        // the code here is never executed because scnView.scene is nil
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

        // create and add a camera to the scene
        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        scene.rootNode.addChildNode(cameraNode)

        // place the camera
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)

        // create and add a light to the scene
        let lightNode = SCNNode()
        lightNode.light = SCNLight()
        lightNode.light!.type = SCNLightTypeOmni
        lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
        scene.rootNode.addChildNode(lightNode)

        // create and add an ambient light to the scene
        let ambientLightNode = SCNNode()
        ambientLightNode.light = SCNLight()
        ambientLightNode.light!.type = SCNLightTypeAmbient
        ambientLightNode.light!.color = UIColor.darkGrayColor()
        scene.rootNode.addChildNode(ambientLightNode)

        // retrieve the ship node
        let ship = scene.rootNode.childNodeWithName("ship", recursively: true)!

        // animate the 3d object
        ship.runAction(SCNAction.repeatActionForever(SCNAction.rotateByX(0, y: 2, z: 0, duration: 1)))
    }
}
…然后像这样在故事板上找到ship.dae文件

为什么没有加载.dae文件?例如,使用图像视图而不是SceneKit视图,并从应用程序包中的资源中选择一些.png文件


是项目的zip文件,如果有人想试试的话。

我做了一些广泛的测试,我相信这是一个bug

除了场景一外,IB属性所有工作都正常。如果删除
GameViewController.swift中的所有代码,您将看到背景为红色,正如您在IB中定义的那样

我创建了一系列新项目,包括Swift和Objective-C、iOS和OSX、游戏模板和常规应用程序、故事板和经典IB。它们都有相同的问题

我查看了IB文件,没有发现任何异常。属性名为
sceneame
,因此我必须检查问题是否来自Scenekit

我决定再深入一点,看看问题出在哪里。我发现SCNView有一个私有属性,
NSString*\uuu ibSceneName。通过测试,证明设置正确。还有一个名为
-(void)set_ibSceneName:(id)arg1的私有方法。子类化证明它被正确调用(尽管它可能只是一个经典的setter)

为了确保最后一次,我使用工具记录了所有文件系统交互。以下是正常模板的结果:

以下是IB的结果:

我的猜测是这个函数的实现可能丢失了,或者没有正确地创建SCNScene。我会向苹果公司提交一份关于这个问题的错误报告

同时,您可以简单地将SCNView子类化,并添加一个自定义字符串属性,例如
myScene
。然后,您可以在IB中设置它:

然后,只需从属性导入场景,并在自定义子类中将其设置为init。如果您需要代码示例,请告诉我

编辑7月1日:以下是我从苹果收到的信息:

我们相信这个问题已经在最新的Xcode 7测试版中得到了解决。 此版本包括Xcode IDE、Swift 2编译器、仪器、, 模拟器,以及适用于OS X、iOS和watchOS的最新SDK

请使用此版本进行测试。如果您还有问题,请 提供任何可以帮助我们的相关日志或信息 调查

Xcode 7测试版


指定
art.scnassets/ship.dae
而不是
ship.dae
应该这样做。

是的,我也认为这是一个bug,我创建了一个可检查的NSString属性,我使用它从IB设置场景名称,然后在awakeFromNib中加载场景,正如您所建议的,感谢您还没有奖励,因为计时器,我过会儿再查,谢谢!我向苹果公司提交了一份缺陷报告(rdar://19988244),我会在收到结果后更新。我更新了答案以添加苹果的官方响应,我还没有时间尝试测试版。我现在似乎正在使用Xcode 6.4和Xcode 7测试版,但只有在我指定
art.scnassets/ship.dae
的情况下,即使drop box中的建议场景不包含子文件夹Nop,它也不会(已经尝试过)将.dae文件拖到该文件夹之外也不会起作用。在运行时,检查器上的场景属性似乎没有“连接”到SceneKit视图