【问题标题】:Getting error when using the removeChild method使用 removeChild 方法时出错
【发布时间】:2010-12-11 17:32:46
【问题描述】:

祝大家万圣节前快乐 :)

我今天的问题是删除子对象时出现的 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");
}

关闭视频播放器代码: 您可以在我的 cmets 中看到我尝试过的其他代码,但仍然出现错误。

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 侦听器,但忘记删除愚蠢的 Close Button 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);
    }
}

不知道这张图是否有帮助,但是:

【问题讨论】:

  • 您不需要多次调用 closeVideo()。它应该只调用一次。初始化容器时,每个视频都很常见。无需关闭视频,只需调用 closeButtonClicked() 即可处理所有事情,即清除视频源、删除 videoClass 和 videoContainer。通过多次调用 closeVideo,您正在为 closeButton 创建多个处理程序,这会导致此运行时错误。

标签: flash actionscript-3 addchild displayobject removechild


【解决方案1】:

试试这个:

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

【讨论】:

  • 仍然出现该错误,但电影仍然可以正常工作...想知道我是否真的应该担心这个 hmmz
  • 现在也试试这个:if(videoContainer.parent != null) videoContainer.parent.removeChild(videoContainer);但结果相同
【解决方案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 条错误消息。不刷新我再次播放另一个视频并关闭它我收到 2 条相同的错误消息,3 条视频 3 条错误消息跟踪出来,可能是提示?
【解决方案3】:

我感觉是其他一些代码导致了实际问题。如果在其他地方更改了 videoPlaying 变量以使您删除尚不存在的内容,则此错误将有意义。也许检查您没有在其他地方更改此变量。

【讨论】:

  • 是的,我认为还有其他一些我没有看到的东西仍然在这里连接,尝试了 3 种不同的方式,所有这些都很好,但那个错误仍然存​​在
【解决方案4】:

你曾经移除过监听器吗?您可能会多次触发它。

【讨论】:

  • 原来如此,天哪!忘记删除 closeButtonClicked 事件! /facepalm removeContainerChildren(); closeBtn.removeEventListener(MouseEvent.MOUSE_UP, closeButtonClicked); ontainer.removeChild(closeBtn);
【解决方案5】:

这是执行此操作的另一种超级 hacky 方式,通常不推荐,但它肯定会确保 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's 持有。

希望对你有帮助

【讨论】:

  • 我忘记移除 closeButton 事件监听器了! closeBtn.removeEventListener(MouseEvent.MOUSE_UP, closeButtonClicked);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多