如何从加载的swf访问父movieclip的变量

chc*_*ist 5 swfloader loader actionscript-3

我有一个加载外部swf的swf.加载器swf有一个我想从加载的swf访问的变量.我使用MovieClip(parent.parent).myVar但它返回此错误

TypeError:错误#1009:无法访问空对象引用的属性或方法.at card01_fla :: MainTimeline/frame1()

加载器swf有一个自定义文档类,我认为这是问题.

提前致谢.

编辑

这是主要的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);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我试图使用此代码从加载的swf访问测试变量

trace(MovieClip(parent.parent).testVar);
Run Code Online (Sandbox Code Playgroud)

编辑#2

如果我addChild(loader)不在onCardInit但在onViewClick和加载的swf的第一帧中我有Object(parent.parent).testVar它的工作...但为什么它不想在onCardInit函数内?

Ama*_*osh 2

您只有一个loader变量,并且要创建四个Loader实例并将它们分配给它 - 因此,如果您快速连续单击所有四个实例,则该loader变量将有效包含Loader与最后一次单击相对应的对象。您的所有addChild调用都将作用于同一个Loader对象 - 其他调用将不会被添加,并且它们的父对象将继续null

对代码进行以下更改:

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);
}
Run Code Online (Sandbox Code Playgroud)

回答问题中的以下更新:

如果我addChild(loader)onViewClick而不是onCardInit,那么Object(parent.parent).testVar在加载的 swf 的第一帧中就可以了。为什么我在 onCardInit 函数中 addChild 不起作用?

同样,这可能是因为您正在添加一个不同的loader对象 - 您是否单击了多个视图按钮?单击查看按钮并等待其加载以查看其工作情况。