非常奇怪:如果我想访问加载的swf中的属性,则会出现flash错误

时间:2011-04-10 20:46:18

标签: flash actionscript-3

更新

我尝试访问(MySWF(movieClip))。id但我得到一个奇怪的消息错误:

1120:访问未定义的属性aslider

在MySWF.init中定义。如果我删除(MySWF(movieClip))。id程序工作正常!

这不是很奇怪,特别是因为我添加了addEventListener(Event.ADDED_TO_STAGE,init);在MySWF构造函数中确保aslider在舞台上。

主要:

  private var idMySWF:int;
  public function loadMySWF(event:MouseEvent) {

  idMySWF = 1;
  var myLoader:Loader = new Loader();
  myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
  myLoader.load(new URLRequest("MySWF.swf"));           
  myZone.addChild(myLoader);

  }       

  public function loadComplete(evt:Event):void {

  var movieClip:MovieClip;
  var myLoader:Loader;
  myLoader = evt.currentTarget.loader as Loader;

  movieClip = MovieClip(loader.content);
  myLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadComplete);
  myLoader = null
  movieClip.addEventListener(CustomEvent.ON_CUSTOM_EVENT,OnCustomEvent);      
  (MySWF(movieClip)).id = idMySWF;

  }

在MySWF中:

  private var _id:int;

  public function get id():int {
      return _id;
  }

  public function set id(__id:int):void {
      _id = __id;
  }

  public function MySWF() { 

    addEventListener(Event.ADDED_TO_STAGE, init);   

  }
  public function init( e:Event ):void {

    removeEventListener( Event.ADDED_TO_STAGE, init );      
    aslider.addEventListener(SliderEvent.CHANGE,OnSliderEventChange);

  }

3 个答案:

答案 0 :(得分:1)

myZone.addChild(loader);应为myZone.addChild(myLoader);我想我会把它放在myLoader.load(new URLRequest("MySWF.swf"));之前,以防加载过快!

答案 1 :(得分:1)

*** 更新 *** 好的,所以我原来(下面)的回答并不完全正确。直接查看FLA后,结果表明,在设计时使用文档类与放置在舞台上的预定义对象实例相结合是一个问题。 flash会在运行时自动生成/声明对这些实例的引用,因此直接通过文档类访问它们的唯一方法就是引用它们:

var myObject:Slider = this [“sliderNameInFlashIDE”];

以下是关于此问题的完整文章以及需要在IDE中禁用此自动声明功能的替代解决方法。

http://blog.ickydime.com/2008/07/as3-notes-automatically-declare-stage.html

所以基本上它适用于你的代码:

 public function OnCustomEvent(event:CustomEvent): void {

       this[\"labelValue\"].text = event.value + \"\";
       var cEvent: CustomEvent;
       cEvent = new CustomEvent(CustomEvent.ON_CUSTOM_EVENT);
       cEvent.value = event.value;
       this.dispatchEvent(cEvent);

 }

 public function init( e:Event ):void {

   removeEventListener( Event.ADDED_TO_STAGE, init );

   this.addEventListener(CustomEvent.ON_CUSTOM_EVENT,OnCustomEvent);
   this[\"aslider\"].addEventListener(SliderEvent.CHANGE,OnSliderChange);

 }

解决具有空对象引用的问题。

此外,如果我复制和粘贴的任何代码对项目的性质过于透露,请告诉我,我可以将代码更改为更通用,所以仍然要点,但性质模糊不清。 / p>

*** 原始回答 *** 您将获得访问未定义错误,因为对象引用存在于对象之前。在构造父项的显示列表时构造对象。您需要将Event.ADDED_TO_STAGE的事件侦听器添加到MySWF的构造函数中,并在回调中将该事件侦听器(SliderEvent)添加到ADDED_TO_STAGE。

http://www.emanueleferonato.com/2009/12/03/understand-added_to_stage-event/

http://forums.adobe.com/message/3464172(特别是兰迪的帖子):

“当命中构造函数代码时,显示对象”大部分“准备就绪。但有时为”添加到舞台“添加事件侦听器更安全,并且在处理程序中,所有内容都将被初始化。例如,我发现在此事件触发后从loaderInfo获取Flash Vars更好。“

答案 2 :(得分:0)

首先,您的行:

idMySWF: 1;

不执行我认为您期望的操作,请尝试使用等号:

idMySWF = 1;