Swift UIViewController未加载属性检查器中指定的DAE文件
我在Xcode 6.1.1上使用iOS游戏模板创建了一个新项目,选项如下: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
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视图