2010-06-11 55 views
2

这是我第一次在这里发表问题。Flash AS3按钮eventlistener阵列bug

我有一个时间轴上的12个按钮的数组,当第一次访问时间线的那一部分时,使用for循环获取CLICK eventlistener添加到它们。他们所有人都在这一点上完美地工作。

当您单击它时,它会在特定的movieClip中播放帧标签,并使用关闭按钮显示相应人物上的生物,然后再次使用for循环删除每个按钮的CLICK eventlisteners。关闭按钮播放关闭动画,然后时间线返回到第一帧(其上有12个按钮),CLICK事件监听器被重新添加,但现在只有阵列的前9个按钮可以工作。没有输出错误,重新添加eventlisteners的代码与第一次运行完全一样。我完全无所适从,想知道是否有其他人遇到了这个问题。

我所有的按钮命名都是正确的,绝对没有输出错误(我已经使用了调试模块),并且确保在点击关闭按钮的时候,带有按钮的数组正在输出全部12个按钮添加事件监听器。

for (var q = 0; q < ackBoDBtnArray.length; q++){ 
     contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[q]].addEventListener(MouseEvent.CLICK, showBio); 
    } 

    private function showBio(eo:MouseEvent):void { 
     trace("show the bio"); 
     bodVar = ackBoDBtnArray.getIndex(eo.target.name); 
     contentArea_mc.acknowledgements_mc.BoD_mc.gotoAndPlay(ackBoDPgArray[bodVar]); 
     contentArea_mc.acknowledgements_mc.BoD_mc.closeBio_btn.addEventListener(MouseEvent.CLICK, hideBio); 
     for (var r = 0; r < ackBoDBtnArray.length; r++){ 
      contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[r]].mouseEnabled = false; 
      contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[r]].removeEventListener(MouseEvent.CLICK, showBio); 
     } 
    } 
    private function hideBio(eo:MouseEvent):void { 
     trace("hide it!"); 
     contentArea_mc.acknowledgements_mc.BoD_mc.closeBio_btn.removeEventListener(MouseEvent.CLICK, hideBio); 
     contentArea_mc.acknowledgements_mc.BoD_mc.gotoAndPlay(ackBoDClosePgArray[bodVar]); 
     for (var s = 0; s < ackBoDBtnArray.length; s++){ 
      trace(ackBoDBtnArray[s]); 
      contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[s]].mouseEnabled = true; 
      contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[s]].addEventListener(MouseEvent.CLICK, showBio); 
     } 

预先感谢任何帮助和洞察力,您可以提供...我有一个轻微的感觉,它的东西,可能是显而易见的另一套的眼睛...哈哈。

+0

对于最后三个,在调试的痕迹中看到了什么? – phwd 2010-06-11 19:56:43

+0

你要导出什么Flash版本?如果你正在访问一个框架上的东西,你只是gotoAndStop-ed ..它可能无法访问..应该做一个运行时异常虽然..如果你只是在数组中存储字符串..尝试跟踪对象..如果他们中的一些是不是null(再次..它应该给出一个运行时异常,如果他们是......但没有其他事情在我心中) – Antriel 2010-06-11 20:14:18

回答

0

这似乎解决它,我不得不只需添加每BTN动态而不是仅仅让他们在时间轴上的。但仍然奇怪,谢谢大家

0

对我来说看起来很可疑的事情是,您在hideBio()的开始处从closeBio_btn中删除事件侦听器。尝试在for循环之后放置该行。

我无法证明这一预感,但已越过我的脑海里一对夫妇的野生理论是:

  1. 这是一个竞争条件。您从处理程序本身中删除处理程序的侦听器,并且由于该处理程序是动态添加的,因此运行时将标记处理程序以进行垃圾回收。在下一次扫描中,处理程序被删除 - 但由于gotoAndPlay可能需要很长时间,所以处理程序仍处于for循环中,在处理程序中添加了click处理程序,并且此时仅添加了前9个处理程序。
  2. 这是一个数据损坏问题。由于隐藏按钮和12个按钮的数组至少通过BoD_mc相切,所以运行时在幕后进行了一些奇怪的优化,使得在closeBio_btn被触摸后通过Bod_mc [索引]访问项目不可靠。

这是一个有趣的问题,我希望你找到一个解决方案:)