加载swf并通过界面使用它

时间:2010-08-12 07:35:21

标签: actionscript-3 flash

我用界面创建了简单的swf:

public class Test extends MovieClip implements ITest
{

    public function Test()
    {
        Security.allowDomain("*");
        Security.allowInsecureDomain("*");
    }

    public function speak(str):String
    {
        trace(str);
        return "yeah";
    }
}

ITEST:

public interface ITest {

    // Interface methods:
    function speak(str):String
}

然后我正在尝试加载它:

    public function SWFLoader() 
    {
        var url='http://xxxxxxxx/test.swf';
        var loadURL:URLRequest=new URLRequest(url);
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
        var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
        loader.load(loadURL, context);
    }

    private function completeHandler(event:Event):void 
    { 
        var test:ITest;
        test = event.target.content as ITest;
        test.speak("ggg");
    } 

因此,如果我在同一目录(本地方式)中有test.swf,那就可以了。但是,如果我将它放在专用服务器上:(event.target.content as ITest)返回null。但是,我可以访问speak()而不需要像event.target.content.speak(“a!”)这样的界面;

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

如何在两个swf之间共享ITest界面?

我想你有两个项目,一个用于test.swf(加载的一个),另一个用于加载器(我称之为loader.swf)。我想你不能只宣告两次ITest接口(一个用于test.swf,一个用于loader.swf)。如果这样做,将有两个接口,具有相同的接口名称,相同的声明方法,但它们仍然是2个不同的接口。而将一个投入另一个将失败 我打赌,如果你这样做(按照PatrickS的建议)

var test:ITest = ITest(event.target.content ); 

您会看到类型错误 - >这就是这种铸造方式的优势。这将证实我的想法:两个接口是不同的。

要真正共享2个项目之间的接口,您应该将其存储到库(.swc文件)中,并在2个项目中使用该库。这应该可以解决问题。