2016-07-30 93 views
0

我有一个非常大(500mb).dae文件需要几秒钟加载,所以我加载它在后台一次,并在两个相同的视图控制器中重复使用它。第一个控制器显示模型很好,但是当我模态地呈现下一个视图控制器(它也显示模型正常)并解除它时,该模型已消失,从第一个视图控制器的场景中移除。 SceneKit在清理SCNView时是否尝试处理节点?我不知道我还能解释发生了什么,因为这两个视图控制器是用作子视图控制器的同一类的两个实例。SCNNode在两个视图控制器之间共享消失

// CarLoader.swift 
class CarLoader { 
    private static let instance = CarLoader(); 

    var storedCar: SCNNode = SCNNode(); 
    var loaded: Bool = false; 
    var onReady:(car: SCNNode)->() = { (car: SCNNode) in } ; 

    private init(){} 

    class func load(onLoad:()->()){ 
     if CarLoader.instance.loaded { 
      onLoad(); 
      return; 
     } 
     dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)) { 
      let scene = SCNScene(named: "Scenes.scnassets/export_test6.dae"); 
      dispatch_async(dispatch_get_main_queue()) { // 2 
       let nodeArray = scene!.rootNode.childNodes; 
       let centeringNode = SCNNode(); 
       for childNode in nodeArray { 
        centeringNode.addChildNode(childNode as SCNNode) 
       } 

       centeringNode.eulerAngles.x = -Float(M_PI/2); 

       var min = SCNVector3(), max = SCNVector3(); 
       let _ = centeringNode.getBoundingBoxMin(&min, max: &max); 

       let w = CGFloat(abs(max.x - min.x)); 
       let h = CGFloat(abs(max.y - min.y)); 
       //let l = CGFloat(abs(max.z - min.z)); 

       centeringNode.position.x = -min.x + -Float(w/2); 
       centeringNode.position.y = -min.y/2 + -Float(h/2); // it's still a little low in y, but we want it lower 
       centeringNode.position.z = 0; 

       CarLoader.instance.storedCar = centeringNode; 
       CarLoader.instance.loaded = true; 
       CarLoader.instance.onReady(car: centeringNode); 
       onLoad(); 
      } 
     } 
    } 
    class func cachedModel(onReady: (car: SCNNode) ->()) { 
     CarLoader.instance.onReady = onReady; 
     if CarLoader.instance.loaded { 
      CarLoader.instance.onReady(car: CarLoader.instance.storedCar); 
     } 
     else { 
      // callback is called when ready 
     } 
    } 
} 

回答

0

我最终通过命名它并检查它是否存在于ViewDidAppear中来解决它。

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated); 
    // the car disappears in the Explorer when it reappears after the settings menu has been up 
    if self.carRootNode.childNodeWithName(CarLoader.CarModelNodeName, recursively: false) == nil { 
     self.insertCarModel(); 
    } 
} 
相关问题