代码之家  ›  专栏  ›  技术社区  ›  chchrist

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

  •  5
  • chchrist  · 技术社区  · 15 年前

    我有一个加载外部SWF的SWF。加载程序SWF有一个变量,我想从加载的SWF访问该变量。我用 MovieClip(parent.parent).myVar 但它返回这个错误

    类型错误:错误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函数中?

    5 回复  |  直到 8 年前
        1
  •  2
  •   Amarghosh    15 年前

    你只有一个 loader 变量,你创建了四个 Loader 实例并将它们分配给它-因此,如果您要快速连续地单击所有四个实例,则 装载机 变量将有效地包含 装载机 与上次单击对应的对象。所有你的 addChild 电话也会这样 装载机 对象-其他对象将不会被添加,其父对象将继续 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函数中添加child,它为什么不工作?

    同样,这可能是因为您添加了 装载机 对象-是否单击多个视图按钮?单击一个视图按钮,等待它被加载,直到看到它工作。

        2
  •  2
  •   j0k gauthamp    12 年前

    parent.parent错误。 尝试使用:

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

    您必须将第一个父类强制转换为类似movieclip的类,然后获取这个新movieclip的父类,然后进入变量。

        3
  •  0
  •   Oliver    15 年前

    尝试跟踪parent和parent.parent,我确信这是因为一个附加的“parent”

        4
  •  0
  •   glenn grant    11 年前

    loader.content不是movieclip,因此它没有相同的功能。尝试

    myloadedclip:movieclip=movieclip(loader.content);

    然后你的myloadedclip.parent.myvar就会出现

    您可能希望处理程序在event.complete上激发,而不是在event.init上激发。

        5
  •  0
  •   Fabio Nani    8 年前

    加载的SWF中只有这一行代码可以解析它!;)

    movieclip(movieclip(parent.parent).root).play();