2010-06-11 71 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 [索引]訪問項目不可靠。

這是一個有趣的問題,我希望你找到一個解決方案:)