2016-07-30 5 views
0

Ich habe eine sehr große (500mb) .dae-Datei, die ein paar Sekunden dauert zu laden, also lade ich es einmal im Hintergrund und wieder in zwei identische View-Controller. Der erste Controller zeigt das Modell in Ordnung, aber wenn ich den nächsten View-Controller modal präsentiere (der auch das Modell fein anzeigt) und ihn verwerfe, ist das Modell aus der Szene des ersten View-Controllers verschwunden. Versucht SceneKit, Knoten zu beseitigen, wenn ein SCNView bereinigt wird? Ich bin mir nicht sicher, wie ich sonst noch erklären könnte, was passiert, weil die beiden View-Controller zwei Instanzen der gleichen Klasse sind, die als Kind-View-Controller verwendet werden.SCNNode zwischen zwei View-Controller verschwindet

// 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 
     } 
    } 
} 

Antwort

0

Ich habe mich am Ende damit beschäftigt, es zu benennen und zu überprüfen, ob es während ViewDidAppear da ist.

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(); 
    } 
} 
Verwandte Themen