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

时间:2009-11-25 15:15:12

标签: actionscript-3 loader swfloader

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

  

TypeError:错误#1009:无法访问空对象引用的属性或方法。       在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);
        }

    }
}

我试图使用此代码

从加载的swf访问测试变量
trace(MovieClip(parent.parent).testVar);

修改#2

如果我addChild(loader)不在onCardInit但在onViewClick中并且在加载的swf的第一帧中我有Object(parent.parent).testVar它有效...但为什么它不想在里面onCardInit函数?

5 个答案:

答案 0 :(得分: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);
}

回答问题中的以下更新:

  

如果addChild(loader)中的onViewClick代替onCardInit,则加载的swf的第一帧中的Object(parent.parent).testVar有效。如果我在onCardInit函数中添加addChild,为什么它不起作用?

同样,这可能是因为您要添加不同的loader对象 - 您是否单击了多个视图按钮?单击一个视图按钮,等待它加载,看它是否正常工作。

答案 1 :(得分:2)

parent.parent是错误的。 尝试使用:

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

你必须将第一个父类转换为某个类,如MovieClip,然后获取这个新的MovieClip的父级,然后获取内部变量。

答案 2 :(得分:0)

尝试跟踪parent和parent.parent,我确定这是因为另外一个“父母”

答案 3 :(得分:0)

loader.content不是动画片段,因此它没有相同的功能。试试

myLoadedClip:MovieClip = MovieClip(loader.content);

然后你的myLoadedClip.parent.myVar应该出现

你可能希望你的处理程序在Event.COMPLETE而不是在Event.INIT

上触发

答案 4 :(得分:0)

加载的swf中唯一的行代码解决了它! ;)

<强>的MovieClip(影片剪辑(parent.parent).root).play();