2009-11-25 14 views
5

Ich habe eine swf, die eine externe SWF laden. Der Loader swf hat eine Variable, auf die ich vom geladenen swf zugreifen möchte. Ich benutze MovieClip(parent.parent).myVar aber es zurückgeben diesen FehlerWie Zugriff auf Eltern MovieClip-Variable von geladenen SWF

TypeError: Error #1009: Cannot access a property or method of a null object reference. at card01_fla::MainTimeline/frame1()

Der Lader swf eine benutzerdefinierte Dokumentenklasse hat, die ich denke, das Problem ist.

Vielen Dank im Voraus.

EDIT

Dies ist der als der Haupt-SWF ist

package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 

    /** 
    * ... 
    * @author chchrist 
    */ 
    public class CardSender extends Sprite 
    { 

     private var loader:Loader; 
     private var viewButtonArray:Array; 
     private var sendButtonArray:Array; 
     private var cardContainer:Sprite; 

     public var testVar:String 

     public function CardSender() { 

      testVar = "it worked!!!"; 
      init(); 
     } 

     private function init() { 
      viewButtonArray = [cardsenderMC.view01, cardsenderMC.view02, cardsenderMC.view03, cardsenderMC.view04]; 

      for each(var viewButton in viewButtonArray) { 
       viewButton.buttonMode = true; 
       viewButton.addEventListener(MouseEvent.CLICK, onViewClick); 
      } 
     } 

     private function onViewClick(e:MouseEvent):void { 
      var cardName = "card"+e.target.name.substring(4)+".swf"; 
      loader = new Loader(); 
      loader.load(new URLRequest(cardName)); 
      loader.contentLoaderInfo.addEventListener(Event.INIT, onCardInit); 
     } 

     private function onCardInit(e:Event):void { 
      addChild(loader); 
      var content:* = loader.content; 
      content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick); 
     } 

     private function onCloseClick(e:MouseEvent):void { 
      removeChild(loader); 
     } 

    } 
} 

und ich versuche, die Testgröße aus der geladenen swf mit diesem Code für den Zugriff auf

trace(MovieClip(parent.parent).testVar); 

EDIT # 2

Wenn ich addChild(loader) nicht im onCardInit sondern im onViewClick und im ersten Frame des geladenen swf habe habe ich Object(parent.parent).testVar es funktioniert ... aber warum will es nicht in der onCardInit Funktion sein?

+0

welches wirft null - eltern oder parent.parent? – Amarghosh

+0

parent.parent wirft null – chchrist

+0

was erhält man für 'trace (parent); - Was ist sein Datentyp? – Amarghosh

Antwort

2

Sie haben nur eine loader Variable und Sie erstellen vier Loader Instanzen und sie es zuweisen - so, wenn Sie klicken auf alle vier in schneller Folge, die loader Variable enthält effektiv das Objekt Loader, das dem letzten Klick entspricht. Alle Ihre addChild Anrufe wirken auf demselben Loader Objekt - die anderen werden nicht hinzugefügt werden und ihre Eltern werden weiterhin null

Nehmen Sie die folgenden Änderungen an dem Code sein:

private function onCardInit(e:Event):void 
{ 
    addChild(LoaderInfo(e.currentTarget).loader); 
    var content:DisplayObject = loader.content; 
    trace(content); 
    trace(content.closeButton); 
    content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick); 
} 

private function onCloseClick(e:MouseEvent):void 
{ 
    trace(e.currentTarget);//should be the closeButton 
    trace(e.currentTarget.parent);//should be the loaded swf 
    trace(e.currentTarget.parent.parent);//should be the Loader object that loaded it 

    //The following will work only if last three traced correctly 
    removeChild(e.currentTarget.parent.parent); 
} 

Antwort auf die folgende Update in der Frage:

If I addChild(loader) in the onViewClick instead of onCardInit , then Object(parent.parent).testVar in the first frame of the loaded swf works. Why doesn't it work if I addChild inside the onCardInit function?

Auch das sein könnte, weil Sie ein anderes loader Objekt hinzufügen - sind, klicken Sie mehr als einen viewbuttons auf? Klicken Sie auf eine Ansichtsschaltfläche und warten Sie, bis sie geladen ist, damit sie funktioniert.

+0

Ja, ich stimme zu, aber mein wirkliches Problem ist jetzt, wie man von der geladenen swf auf die Variable testVar zugreifen kann. – chchrist

+0

Wo versuchen Sie, darauf zuzugreifen? aus dem Konstruktor der Dokumentenklasse? Ereignishandler? Knopfklasse? - Ich denke, ein Code würde helfen, – Amarghosh

+0

aus dem ersten Frame des geladenen SWF – chchrist

0

versuchen Tracing Eltern und parent.parent, ich bin sicher, dass es wegen eines aditional „Eltern“ ist

2

parent.parent ist falsch. versuchen Sie es mit:

MovieClip(MovieClip(e.currentTarget.parent).parent).myVar ; 

Sie haben die ersten Eltern bis zu einem gewissen Klasse wie MovieClip- werfen und erhalten dann dieses neue MovieClip- der Eltern und dann in Variable bekommen.

0

loader.content ist KEIN MovieClip, also hat es nicht die gleichen Fähigkeiten. versuchen

myLoadedClip: MovieClip = MovieClip (loader.content);

dann sollte Ihr myLoadedClip.parent.myVar zeigen

Sie Ihre Handler auf einem Ereignis feuern wollen könnte.COMPLETE anstelle von einem Event.INIT

0

Dieser einzige Zeilencode im geladenen swf löst es! ;)

MovieClip (MovieClip (parent.parent) .root) .play();

Verwandte Themen