removeChildメソッドの使用時にエラーが発生する
-
22-07-2019 - |
質問
ハッピーハロウィン前の皆さん:)
今日の問題は、子オブジェクトを削除するときに表示されるDisplayObjectエラーです。ビデオコンテナとビデオコントロールを起動(addChild)し、閉じるボタンを追加するコードがあります。 閉じるボタンが正常に機能するようになりました、ビデオとコントロールを削除して、別の動画をもう一度選択できますが、2回目に閉じるをクリックすると、次のエラーが表示されます:
ArgumentError:エラー#2025:指定されたDisplayObjectは、呼び出し元の子である必要があります。 flash.display :: DisplayObjectContainer / removeChild()で
したがって、問題をビデオコンテナー(ビデオオブジェクトを保持する)を削除する場所に絞り込みました
動画を再生するためのコード:
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);
}
}
このグラフィックが役立つかどうかわからないが:
解決
リスナーを削除したことがありますか?複数回起動させることもできます。
他のヒント
エラーを回避するための1つのアプローチを次に示します。
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変数が他の場所で変更され、まだ存在しないものを削除する場合に意味があります。この変数を別の場所で変更していないことを確認してください。
これは別の非常にハッキングされた方法であり、通常は推奨されませんが、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;
}
繰り返しますが、これは好ましい方法ではありませんが、エラーなしで機能します。 「nullオブジェクト参照にアクセスできません」を取得し始めた場合エラー、その後、前の人々が示唆したように、イベントリスナーまたは他のいくつかの依存関係は、問題の DisplayObject
によってまだ保持されています。
これが役立つことを願って