2009-10-30 38 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