5

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

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

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

提前致谢。

编辑

这是主 swf 的 as

    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 函数内?

4

5 回答 5

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,那么Object(parent.parent).testVar在加载的 swf 的第一帧中工作。如果我在 onCardInit 函数中 addChild 为什么它不起作用?

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

于 2009-11-25T16:25:03.420 回答
2

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

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

您必须将第一个父级转换为像 MovieClip 这样的类,然后获取这个新的 MovieClip 的父级,然后进入变量。

于 2012-08-07T05:44:03.023 回答
0

尝试跟踪 parent 和 parent.parent,我确定这是因为附加的“父母”

于 2009-11-25T16:03:25.410 回答
0

loader.content 不是影片剪辑,因此它没有相同的功能。尝试

myLoadedClip:MovieClip = MovieClip(loader.content);

那么你的 myLoadedClip.parent.myVar 应该出现

您可能希望您的处理程序在 Event.COMPLETE 而不是 Event.INIT 上触发

于 2013-10-17T15:48:53.893 回答
0

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

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

于 2016-05-26T19:04:42.643 回答