万圣节快乐大家:)
我今天的问题是删除子对象时出现的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);
}
}
不知道这个图形是否有帮助但是:
答案 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'
持有。
希望这有帮助