|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Sep 2012
Сообщений: 26
|
создать объект с известным интерфейсом, реализованным во внешнем swf
есть swf с одним классом реализующим интерфейс.
нужно загрузить swf и создать объект с этим интерфесом. пробовал: 1)загружать через Loader и кастовать содержимое к интерфейсу 2)загружать через UrlLoader в byteArray, вычитывать объект и кастовать к интерфейсу. 2-ой вариант: public function foo() { var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, OnLoaded); loader.load(new URLRequest("ISomeInterfaceImplementation.swf")); } private function OnLoaded(event:Event):void { trace("OnLoaded"); var ba:ByteArray = URLLoader(event.target).data; ba.position = 0; var someObj = ba.readObject() as ISomeInterface; } |
|
|||||
Странно, что у вас первый способ не работает. Вот рабочий код:
// Файл IHelloInterface.as package { public interface IHelloInterface { function hello(message:String):void; } } // Файл Test.as содержащий класс имплементирующий интерфейс package { import flash.display.Sprite; import flash.events.Event; import IHelloInterface; public class Test extends Sprite implements IHelloInterface { public function hello(message:String):void { trace(message); } public function Test():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); } } } // Файл Main.as, где происходит загрузка флешки с классом Test package { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; import IHelloInterface; public class Main extends Sprite { private var loader:Loader; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); loader.load(new URLRequest("swfWithClass.swf")); } private function completeHandler(e:Event):void { var helloObject:IHelloInterface = loader.content as IHelloInterface; helloObject.hello("Hello World!"); } } } |
|
|||||
Регистрация: Sep 2012
Сообщений: 26
|
да, действительно всё работает)) Может где-то старую сборку не почистил))
|
|
|||||
А работает у Вас на локалке? В отладочном плеере?
По идее, если это грузится с какого-то домена, то работать без приведения к тому же ApplicationDonain, не должно. Я вот так решал эту проблему (на тот случай, если она возникнет) var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderCompele); if (Security.sandboxType == Security.REMOTE) { var context:LoaderContext = new LoaderContext(); context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); loader.loadBytes(byteArray, context); } else { loader.loadBytes(byteArray); }
__________________
Ко мне можно и нужно обращаться на ты) |
Часовой пояс GMT +4, время: 15:55. |
|
« Предыдущая тема | Следующая тема » |
|
|