Загрузка SWF и использование его через интерфейс - PullRequest
0 голосов
/ 12 августа 2010

Я создал простой 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) возвращает ноль. Тем не менее, я могу получить доступ к speak () без интерфейса, подобного этому event.target.content.speak ("a!");

Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 12 августа 2010

Как вы делитесь интерфейсом ITest между двумя вашими swf?

Я полагаю, у вас есть два проекта: один для test.swf (загруженный) и один для загрузчика (я назову его loader.swf). Я думаю, что вы не можете просто объявить интерфейс ITest дважды (один для test.swf, один для loader.swf). Если вы это сделаете, будет два интерфейса с одинаковым именем интерфейса, одинаковыми объявленными методами, но они по-прежнему будут двумя разными интерфейсами. И бросить одно в другое не удастся.
Могу поспорить, что если вы делаете (как предложено PatrickS)

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

Вы увидите ошибку типа -> это преимущество этой формы приведения. Это подтвердит то, что я думаю: два интерфейса разные.

Чтобы по-настоящему разделить интерфейс между двумя вашими проектами, вы должны сохранить его в библиотеке (файл .swc) и использовать эту библиотеку в ваших двух проектах. Это должно решить проблему.

0 голосов
/ 12 августа 2010

попробуйте это:

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

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f87.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...