Не удается отправить переменную из flash (parent) в загруженный flex swf (child)? - PullRequest
1 голос
/ 27 марта 2012

Хай пытается загрузить переменные из родительского (flash) в дочерний (flash). Работает нормально,.

parent swf: (flash)

var parentMessage:String = "Hello";
var swf:MovieClip;
var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded);
l.load(new URLRequest("child.swf"));
function swfLoaded(e:Event):void
{
swf = MovieClip(e.target.content);
swf.passVariable(parentMessage);
}

child swf (flex)

public var childMessage:String;
function passVariable(_msg:String):void
{
childMessage = _msg;
trace("message passed from parent to child: " + childMessage);
}

Но при обмене данными со flash он не загружается.

Сообщение об ошибке

ReferenceError: Ошибка # 1069: свойство passVariable не найдено в _child_mx_managers_SystemManager и значение по умолчанию отсутствует.в функции / ()

Пожалуйста, помогите мне.

Обновление

parent.swf во флэш-памяти

 var parentMessage:String = "Hello";
 var swf:MovieClip;
 var l:Loader = new Loader();
 l.load(new URLRequest("asd.swf"));
 swf.addEventListener("applicationComplete", swfLoaded);
 function swfLoaded(e:Event):void
 {
 var app:DisplayObject = swf.getChildAt(1);
 app["passVariable"](parentMessage);
 }

Child.swf в flex

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"  addedToStage="application1_addedHandler(event)" >
<fx:Script>
    <![CDATA[
        public var childMessage:String;

        protected function application1_addedHandler(event:Event):void
        {

            passVariable(childMessage);
        }
        public function passVariable(_msg:String):void
        {

            childMessage = _msg;
            trace("First message passed from parent to child: " + childMessage);
}

    ]]>
</fx:Script>

ErrorMessage

   TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Untitled_fla::MainTimeline/frame1()
   TypeError: Error #1009: Cannot access a property or method of a null object reference.
at mx.managers::FocusManager/activate()
at spark.components::Application/initManagers()
at spark.components::Application/initialize()
at asd/initialize()
at mx.managers.systemClasses::ChildManager/childAdded()
at mx.managers.systemClasses::ChildManager/initializeTopLevelWindow()
at mx.managers::SystemManager/initializeTopLevelWindow()
at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::kickOff()
at       mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::preloader_completeHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.preloaders::Preloader/timerHandler()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

Ответы [ 4 ]

1 голос
/ 27 марта 2012

В приложениях Flex самый высокий спрайт - SystemManager. И Application объект добавляется как дочерний элемент SystemManager. Итак, вам нужно его получить.

swf = MovieClip(e.target.content);
swf.addEventListener("applicationComplete", onApplicationReady);

private function onApplicationReady(evt:Event)
{
    var app:DisplayObject = swf.getChildAt(0);
    app["passVariable"](...);
}

Обратите внимание, что Application добавлено к событию "applicationComplete".

Подробнее о загрузка приложений .

0 голосов
/ 27 марта 2012

Я вижу только то, что функция flex не является общедоступной.

Это препятствует тому, чтобы другие классы видели это.

Измените определение на

public function passVariable(_msg:String):void

EDIT Расширяя мой комментарий,

Лучшим способом было бы перебрать все дочерние элементы swf, и если в этом есть функция passVariable, вызовите ее.

function swfLoaded(e:Event):void {
    for each(var app:DisplayObject in swf.getChildren()) {
        if(app.passVariable != null) {
            app["passVariable"](parentMessage);
        }
    }
}
0 голосов
/ 27 марта 2012

Как насчет этого

http://www.redcodelabs.com/2009/06/call-function-from-flex-to-flash/

Загрузка SWF-файла AS3 с использованием экземпляра SWFLoader.

Вызовите функцию следующим образом:

mySWFLoader.content.functionName ();

Как прослушать флеш-события из flex?

// In your Flex app
/* called when your SWFLoader finishes loading the SWF */
private function onMySWFLoaded( p_event:Event ) :void
{
      mySWFLoader.content.addEventListener( “clicked”, onSWFClick );
}
/* callback for the clicked event */
private function onSWFClick( event:Event ) :void
{
      mx.controls.Alert.show( ‘Click event raised!’ );
}

// В фильме Flash

/* called when the button in your flash movie is clicked */
private function onButtonClick( p_event:Event ) :void
{
      dispatchEvent( new Event( “clicked” );
}

Как вызвать функцию flex из flash на конкретном кадре?

Embed(source=“../assets/swf/myFlashComponent.swf”, symbol=“Preloader”)]
private var FlashPreloaderSymbol:Class;
private var clip:MovieClip;
clip = new FlashPreloaderSymbol();
addChild(clip);
private function onFlexInitComplete( event:FlexEvent ):void
{
clip.addFrameScript(47, callMyFunction);
}
0 голосов
/ 27 марта 2012

Вы, вероятно, делаете одно из двух:

  1. Вы не дождетесь полной загрузки swf, прежде чем пытаться его разыграть
  2. Вы не скомпилировалиКласс SWF в файл Flex (но это должно привести к ошибке компилятора)

Вторая проблема на самом деле является хорошей проблемой - ваш файл Flex не должен знать о реализация методов, которые он будет вызывать, только контракт (или интерфейс) этих методов).

Независимо от того, какая у вас проблема, этот пример , который показывает приведение загруженного SWF к интерфейсу и вызов методов на нем, должен помочь.

...