2016-12-06 2 views
0

Ich habe eine Haupt-swf, die andere swfs lädt. Alles funktioniert einwandfrei mit dem folgenden Code, dass innerhalb des Haupt-SWF ist (Skizze):Wie lade ich externes swf mit Zugriffsstufe in der Dokumentenklasse?

var loader:Loader = new Loader(); 
stage.addChild(loader); 
loader.load(new URLRequest('external.swf')); 

jedoch bei dem Versuch, eine externe swf zu laden, die eine Dokumentenklasse verwendet, es hatte einen Zugriffsfehler auf dem stage Objekt. Um klarer wird eine Dokumentenklasse in der SWF-Veröffentlichung konfiguriert, die geladen werden:

Classe de documento Main

Im Innern der Main.as, hat die Klasse für den Zugangscode auf die Bühne:

package { 
    import flash.display.MovieClip; 
    public class Main extends MovieClip { 
     public function Main() { 
      // access stage 
      trace(stage); 
      trace(stage.stageWidth); 
     } 
    } 
} 

Wenn der Haupt-swf versucht die externe swf zu laden, tritt der Fehler auf:

null 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 

Wie dieses Problem zu lösen?

Antwort

1

Verweise nicht auf stage im Konstruktor eines geladenen SWF. Abonnieren Sie stattdessen Event.ADDED_TO_STAGE.

package { 
    import flash.display.MovieClip; 
    public class Main extends MovieClip { 
     public function Main() { 
      trace("1 stage="+stage); // null, if this swf is loaded 
      addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
     } 
     protected function onAddedToStage(event:Event):void 
     { 
      trace("2 stage="+stage); // object 
     }   
    } 
} 

UPDATE: Falls Sie die geladene SWF nicht ändern können, können Sie die Hauptklassendefinition in Ihrem loader swf außer Kraft setzen. Dies kann unerwünschte Konsequenzen haben, wenn die Hauptklasse des geladenen SWF wichtige und/oder sich ständig ändernde Logik enthält.

  1. definieren Main Klasse in Sie loader swf im gleichen Paket haben Sie es in der geladenen SWF in.
  2. schreiben Sie die richtigen Aktionen mit ADDED_TO_STAGE in Main-Konstruktor auf die Bühne richtig zugreifen.
  3. machen Sie diese Main kompilieren in Ihrem Lader SWF: Fügen Sie einfach Main; in Ihrem Haupt-SWF-Code irgendwo hinzu (dies kann auch mit Compiler-Argument in Flash Builder getan werden, aber warum stören).

Auf diese Weise ersetzen Sie die Definition von Main vollständig.

+0

Das funktioniert wirklich, aber wenn ich das externe swf nicht ändern kann, gibt es eine andere Möglichkeit? – bio

+0

@bioio dann fügen Sie Ihre 'swf' zu' main' Klasse statt Bühne –

+0

Vielen Dank für Ihre Antwort !! – bio

Verwandte Themen