使用removeChild方法时收到错误
-
22-07-2019 - |
题
快乐预万圣节大家:)
我今天的问题是我收到的时候删除子对象的DisplayObject错误。我有一些代码将推出(的addChild)的视频容器和视频控件以及添加关闭按钮。 现在的关闭按钮工作正常,一切,删除视频和控制,我能够再次选择其他的视频,但是当您单击关闭第二次我得到这个错误:
<强>引发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;
}
}
现在我的电影工作正常,但我担心,这个错误发生在后台(和表示我的输出窗口上)将最终导致问题否则其中:(
提前感谢这一个任何的眼睛! :)
<强>更新强> 固定这个问题是我删除了杀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);
}
}
不知道这个图形帮助,但:
解决方案
你有没有删除监听?你完全可以拥有它触发多次。
其他提示
这里是一种方法,以避免错误:
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");
}
尝试这种情况:
container.removeChild(container.videoContainer);
container.removeChild(container.vc);
我感觉,这是引起一些实际问题其他一段代码。如果videuPlaying变量得到了改变别的地方让你删除的东西,不存在尚未这种错误将使意义。也许检查你是不是改变这个变量在其他地方。
这是这样做的另一种超级哈克的方式,通常不推荐但它将definitly确保从哪个DisplayList
它是在videoContainer / VC被去除。
private function removeFromStack(target:DisplayObject):void
{
if (target.parent)
target.parent.removeChild(target);
}
private function removeVideo():void
{
removeFromStack(vc);
removeFromStack(videoContainer);
vc = videoContainer = null;
}
只是为了重新itterate,这不是首选方法,但它没有错误工作。如果你开始得到“无法访问空对象引用”的错误,然后根据以前人们所认为的那样的事件监听器或其他一些依赖关系由有关DisplayObject'
s仍持有。
希望这有助于