Flex:奇怪的问题,无法在SWFLoader的init事件中访问应用程序属性

时间:2009-12-24 07:45:34

标签: flex actionscript

非常奇怪的问题,我是AS的新手,但我不得不说很难理解AS是一种现代语言:


            private function completed():void
            {               
                trace("completed.");                
                var player:Object = (loader.content as SystemManager).application as Object;
                player.playVideo();
                player.setSize(200,300);
            }


    SWFLoader id="loader" horizontalCenter="0" width="100%" height="362" source="http://localhost:8000/testflv1.swf" init="completed()"

我想要做的是在另一个父swf中嵌入一个swf,并从父级到嵌入式swf调用一个函数。然后,我使用SWFLoader的init事件来调用该方法。在此之前,我已经验证了在按钮单击处理程序中使用相同的代码,可以使用:

var player:Object = (loader.content as SystemManager).application as Object;

但是如果在init事件处理程序中,(loader.content as SystemManager).application是null。

然而,在SWFLoader的文件中:

init Dispatched when the properties and methods of a loaded SWF file are accessible.

2 个答案:

答案 0 :(得分:1)

我认为问题出在这里是因为包含文件的应用程序属性尚未初始化。 您可以收听APPLICATION_COMPLETE事件,该事件将告诉您何时完成SWF内容的应用程序属性。

             

        public var loadedSM:SystemManager;

        private function init():void
        {                               
            trace("init.");                            
            loadedSM = SystemManager(loader.content);
            loadedSM.addEventListener(FlexEvent.APPLICATION_COMPLETE, callFunc);                
        }

        private function callFunc(event:FlexEvent):void
        {
            LoadFileInclude(loadedSM.application).playVideo();
        }

    ]]>
</mx:Script>
<mx:SWFLoader id="loader" horizontalCenter="0" width="100%" height="362" source="LoadFileInclude.swf" creationComplete="init()" />  

答案 1 :(得分:0)

我有同样的问题。谷歌永远地搜索,最后找到了一个答案,让我找到了埋藏在Old Nabble thread中的解决方案。

基本上,当注入SWF时,MovieClip本身就处于不同的位置,将它解决是一种痛苦。我做了什么:

MXML:

    <mx:SWFLoader
       id="loader"
        source="@Embed(source='/flash/preloader.swf')" />
AS:
    var mc:MovieClip = Loader(DisplayObjectContainer(swf.content).getChildAt(0)).content 
            as MovieClip;
    if(mc)
    {
        mc.callAFunction();
    }