与SWF Loader交互

时间:2009-07-07 09:43:09

标签: flex actionscript-3 flash

我在我的应用程序中嵌入了一个swf文件

<mx:SWFLoader source="@Embed(source='mod/VideoModule.swf')" width="50" height="50" id="loader" creationComplete="initLoader()" />

现在借助flex文档,我想通过创建一个SystemManager

与我加载的swf进行交互
[Bindable]
    public var loadedSM:SystemManager;

    private function initLoader() : void {
        trace(loader.content);
        loadedSM = SystemManager(loader.content);
        var b: Button = loadedSM.application["button1"] as Button;
        b.addEventListener(MouseEvent.CLICK, test);
    }

但是在启动应用程序时出现错误#1034并且说Main__embed_mxml_mod_VideoModule_swf_856293516 @ 33f53c1无法转换为mx.managers.SystemManager

任何想法?

提前致谢

塞巴斯蒂安

2 个答案:

答案 0 :(得分:3)

首先,我使用SWF加载器的完整事件ad,创建swf加载器时将触发creationComplete事件,而不是加载它的内容。

<mx:SWFLoader source="@Embed(source='mod/VideoModule.swf')" width="50" height="50" id="loader" complete="loaderCompleteHandler(event)" />

然后我还会在事件触发时传递FlexEvent参数。该事件使您可以访问SWFLoader的实例。然后,SwfLoader有一个名为content的属性,可以让你访问加载的swf。如果swf然后公开名为button1的属性,你可以执行以下操作:

private function loaderCompleteHandler(event : FlexEvent) : void 
{
    var swfLaoder : SWFLoader = SWFLoader(event.target);
    swfLaoder.content["button1"].addEventListener(MouseEvent.CLICK, test);
}

答案 1 :(得分:0)

詹姆斯是对的,虽然它可能更简单。您可以使用完整的事件开始使用类似的SWFLoader声明:

<mx:SWFLoader source="@Embed(source='mod/VideoModule.swf')" 
    width="50" 
    height="50" 
    id="loader" 
    complete="swfLoaded(event)" />

然后你可以直接在你的处理程序中引用loader对象(假设脚本与SWFLoader声明在同一个MXML文件中):

private function swfLoaded(event:Event):void
{
    loader.content['button1'].addEventListener(MouseEvent.CLICK, test);
}

或者,如果您想使用SystemManager功能,可以将内容转换为SystemManager并从那里开始:

var loadedSM:SystemManager;
private function swfLoaded(event:Event):void
{
    loadedSM = SystemManager(loader.content);
    var b:Button = loadedSM.application["button1"] as Button;
    b.addEventListener(MouseEvent.CLICK, test);
}

当然,您可能也想为SWFLoader的ioError和securityError事件设置处理程序,以便在出现问题时妥善处理事情。