使用removeChild方法时出错

时间:2009-10-30 19:25:48

标签: flash actionscript-3 addchild displayobject 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工作正常,但我担心在后台发生此错误(并在我的输出窗口中显示)最终会导致其他问题:(

提前感谢您对这一个的关注! :)


更新 已修复!问题是我删除了kill 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

5 个答案:

答案 0 :(得分: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");
    }

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:1)

我有一种感觉,它是导致实际问题的其他代码。如果videuPlaying变量在其他地方被更改,那么这个错误是有意义的,这样你就可以删除那些尚未存在的东西。也许检查一下你是不是在其他地方改变这个变量。

答案 3 :(得分:1)

你有没有删除听众?你很可能会多次开火。

答案 4 :(得分: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'持有。

希望这有帮助