Слушать события из загруженного SWF? - PullRequest
0 голосов
/ 01 сентября 2010

У меня есть простое приложение с одним фильмом, загружающим другой SWF в том же домене. Я могу получить доступ к переменным и функциям в загруженном SWF, но не могу прослушивать события с кнопки; получение ошибки времени выполнения: Ошибка № 1009: невозможно получить доступ к свойству или методу ссылки на пустой объект

Установлены свойства связывания для кнопки

Главная

var assetLoader:Loader = new Loader();
assetLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadingComplete);
assetLoader.load(new URLRequest("home.swf");

function loadingComplete(evt:Event):void {
...
var asset:MovieClip = assetLoader.content as MovieClip;
asset.homeTrace("function in loaded SWF");
trace("var in loaded SWF:", asset.lastFrame);
// Error #1009
asset.enterApp.addEventListener(MouseEvent.CLICK, homeButtons);
...
}

Начало

var lastFrame:Boolean = false;

function homeTrace(p1:String) {
  trace(p1);
}

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 02 сентября 2010

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

С уважением
Евгений

0 голосов
/ 04 сентября 2010

Проблема может заключаться в том, что вы разыгрываете «актив» как MovieClip, вполне может быть Sprite.В любом случае лучше всего поместить все это в try .. catch или if и привести его к безопасному типу *, чтобы избежать ошибок во время компиляции (или если вы хотите пойти по всему дому, используйте интерфейс и объединяйтесьдва applicationDomain контекста, но это обширная тема)

function loadingComplete(evt:Event):void {
   ...
   var asset:* = assetLoader.content;
   if(asset != null){
      try{
         connectModule(asset);
      }catch(err:Error){
         trace("Error accessing module functions", err.getStackTrace());
      }
   }else{
      trace("No module");
   }
}

function connectModule(module:*):void{
   trace("Using typeof", typeof(module), "using constructor", module.constructor, "has the function?", module['homeTrace'] != null);
   module.homeTrace("Function load in swf");
   ...
}

Операторы trace в connectModule должны дать вам дополнительную отладочную информацию, чтобы помочь вам определить, какой тип объекта загружен иили нет, он имеет функцию, к которой вы пытаетесь получить доступ.Дайте мне знать, если это работает для вас.

0 голосов
/ 02 сентября 2010

Я реализовал решение, не то, что я хотел, но работает нормально.Поскольку я не могу добавить прослушиватели для кнопок в загруженном фильме, я добавил общий и использовал переключатель для различения объекта отправителя:

asset.addEventListener(MouseEvent.CLICK, homeButtons);
...
function homeButtons(evt:MouseEvent):void {
  switch(evt.target.toString()) {
    case "[object Send]":
      nextScreen(evt);
      break;
    case "[object Enter]":
      tmpEnter(evt);
      break;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...