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