2009-10-30 40 views
2

快樂前萬聖節前夕大家:)使用removeChild方法時得到錯誤

我今天的問題是我得到的時候刪除一個子對象的DisplayObject錯誤。我有代碼將啓動(addChild)視頻容器和視頻控件以及添加關閉按鈕。 Now the close button works fine and everything,刪除視頻和控制,我能夠再次選擇其他的視頻,但是當您單擊關閉第二次我得到這個錯誤:

引發ArgumentError:錯誤#2025:提供的DisplayObject必須的孩子呼叫者,召集者。在flash.display一::級DisplayObjectContainer/removeChild之()

所以我已經縮小的問題,我刪除videoContainer(持有該視頻對象)

我的代碼,以播放視頻:

public function videoSwitch(videoName):void 
{ 
    nv.closeOut(); 
    nv.resetNav = false; 

    if (!videoPlaying) 
    { 
     vc = new VideoClass(videoName, videoHolder); 
     vc.addEventListener("KillMovie", removePlayer); 
     container.addChild(videoContainer); 
     container.addChild(vc); 
     //container.addChildAt(videoContainer, 1); 
     //container.addChildAt(vc, 2); 
     videoPlaying = true; 
     closeVideo(); 
    } 

    else if (videoPlaying) 
    { 
     vc.clearSource(); 
     container.removeChild(videoContainer); 
     container.removeChild(vc); 

     vc = new VideoClass(videoName, videoHolder); 
     vc.addEventListener("KillMovie", removePlayer); 
     container.addChild(videoContainer); 
     container.addChild(vc); 
     //container.addChildAt(videoContainer, 1); 
     //container.addChildAt(vc, 2); 
     closeVideo(); 
    } 
     trace("videoPlaying = "+videoPlaying+"\r"); 
} 

收出視頻播放器代碼: 你可以在我的意見看其他代碼我試過了,但仍然得到錯誤。

function closeVideo():void 
{ 
    closeBtn.visible = true; 
    closeBtn.x = 770; 
    closeBtn.y = 20; 
    closeBtn.buttonMode = true; 
    container.addChild(closeBtn); 
    closeBtn.addEventListener(MouseEvent.MOUSE_UP, closeButtonClicked); 

    function closeButtonClicked(event:MouseEvent):void 
    { 
     vc.clearSource(); 
     container.removeChild(videoContainer); 
     //container.removeChildAt(videoContainer, 1); 
     container.removeChild(vc); 
     videoPlaying = false; 
     closeBtn.visible = false; 
    } 
} 

現在my movie工作正常,但我擔心,這個錯誤在後臺發生的事情(和顯示在我的輸出窗口上)最終會導致一個問題,別的地方:(

預先感謝在這一個任何眼睛:)


UPDATE: 修復!問題是我刪除了殺VC聽衆,卻忘了刪除愚蠢關閉Mouse_Event聽衆:(

function addCloseButton():void 
{ 
    container.addChild(closeBtn); 
    closeBtn.addEventListener(MouseEvent.MOUSE_UP, closeButtonClicked); 

    function closeButtonClicked(event:MouseEvent):void 
    { 
     videoPlaying=false; 
     vc.clearSource(); 
     removeContainerChildren(); // <- thx Joel! 
     closeBtn.removeEventListener(MouseEvent.MOUSE_UP, closeButtonClicked); 
     //^ Forgot this line - thx Jotham! 
     container.removeChild(closeBtn); 
    } 
} 

不知道這個圖形幫助,但: alt text

+1

你不需要多次調用closeVideo()。它應該只被調用一次。初始化您的容器時,因爲它對每個視頻都很常見。只需調用closeButtonClicked()函數即可清除視頻源,然後移除videoClass和videoContainer,而不是關閉視頻。通過多次調用closeVideo,您正在爲closeButton創建多個處理程序,這會導致此運行時錯誤。 – bhups 2009-10-31 08:39:32

回答

1

你曾經移除過監聽器嗎?你可能會多次觸發它。

+0

這就是它!忘記取消closeButtonClicked事件!/facepalm removeContainerChildren(); \t closeBtn.removeEventListener(MouseEvent.MOUSE_UP,closeButtonClicked); ontainer.removeChild(closeBtn); – 2009-10-31 21:32:04

1

試試這個:

container.removeChild(container.videoContainer); 
container.removeChild(container.vc); 
+0

仍然收到這個錯誤,但電影仍然能正常壽...想知道如果我真的應該擔心這個hmmz – 2009-10-30 20:21:30

+0

嘗試這種現在太:(!videoContainer.parent = NULL)如果 \t \t \t \t \t \t videoContainer.parent .removeChild(videoContainer);但相同的結果 – 2009-10-30 22:12:32

2

這裏是一個方法來避免錯誤:

public function videoSwitch(videoName):void 
    { 
     nv.closeOut(); 
     nv.resetNav = false; 

     if (videoPlaying) 
     { 
      vc.clearSource(); 
      removeContainerChildren() 
     } 

     addContainerChildren(); 
     closeVideo(); 
    } 

    protected function removeContainerChildren():void 
    { 
     if(container.contains(videoContainer)) 
      container.removeChild(videoContainer); 
     if(container.contains(vc)) 
     { 
      container.removeChild(vc) 
      vc.removeEventListener("KillMovie", removePlayer) 
     } 
    } 

    protected function addContainerChildren():void 
    { 
     videoPlaying = true; 
     vc = new VideoClass(videoName, videoHolder); 
     vc.addEventListener("KillMovie", removePlayer, false, 0, true); 
     container.addChild(videoContainer); 
     container.addChild(vc); 

     trace("videoPlaying = "+videoPlaying+"\r"); 
    } 
+0

仍然收到錯誤,但電影仍然正常工作...我現在注意到了一些東西,當我播放1個視頻時,關閉它播放另一個視頻關閉它,我收到1條錯誤消息。不刷新我再次播放另一個視頻並關閉它我得到2個相同的錯誤信息,3個視頻3個錯誤信息追蹤,一個提示也許? – 2009-10-30 21:37:28

1

我有一種感覺,它是導致實際問題的一些其他代碼。如果videuPlaying變量在其他地方發生了變化,那麼這個錯誤是有意義的,這樣你就可以刪除那些尚不存在的東西。也許檢查一下你是不是在其他地方改變這個變量。

+0

是的,我認爲還有其他的東西我沒有看,這仍然是連接在這裏,嘗試了3種不同的方式,所有這些都很好,但那個錯誤仍然存​​在 – 2009-10-31 21:15:20

1

這是做這個的另一個很好的方式,通常不推薦,但它會明確確保videoContainer/vc從它所在的任何一個DisplayList中移除。

private function removeFromStack(target:DisplayObject):void 
{ 
    if (target.parent) 
     target.parent.removeChild(target); 
} 

private function removeVideo():void 
{ 
    removeFromStack(vc); 
    removeFromStack(videoContainer); 
    vc = videoContainer = null; 
} 

只是爲了重新嘗試,這不是首選的方式,但它會工作沒有錯誤。如果您開始得到「無法訪問空對象引用」的錯誤,那麼正如以前的人們所建議的,事件監聽器或其他一些依賴關係仍然存在於DisplayObject'

希望這可以幫助

+0

我忘了刪除closeButton事件監聽器! closeBtn.removeEventListener(MouseEvent.MOUSE_UP,closeButtonClicked); – 2009-10-31 21:33:07