How to access parent movieclip's variable from loaded swf

actionscript-3, loader, swfloader

Solution

You have just one `loader` variable and you're creating four `Loader` instances and assigning them to it - so if you are clicking all four of them in quick succession, the `loader` variable will effectively contain the `Loader` object corresponding to the last click. All your `addChild` calls will act on that same `Loader` object - the others will not be added and their parents will continue to be `null`

Make the following changes to the code:

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

Answer to the following update in the question:

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?

Again, that might be because you are adding a different `loader` object - are you clicking on more than one viewbuttons? Click on a view-button and wait till it is loaded to see it working.

Problem

I have a swf which load an external swf. The loader swf has a variable which i want to access from the loaded swf. I use `MovieClip(parent.parent).myVar` but it return this error TypeError: Error #1009: Cannot access a property or method of a null object reference. at card01_fla::MainTimeline/frame1() The loader swf has a custom Document Class which i think is the problem. Thanks in advance. EDIT This is the as of the main swf ``` 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); } } } ``` and I am trying to access the test variable from the loaded swf with this code ``` trace(MovieClip(parent.parent).testVar); ``` EDIT#2 If I `addChild(loader)` not in the onCardInit but in the onViewClick and in the first frame of the loaded swf i have `Object(parent.parent).testVar` it works...but why it doesn't want to be inside the onCardInit function?

Original source