質問

ハッピーハロウィン前の皆さん:)

今日の問題は、子オブジェクトを削除するときに表示される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);
    }
}

このグラフィックが役立つかどうかわからないが: alt text

役に立ちましたか?

解決

リスナーを削除したことがありますか?複数回起動させることもできます。

他のヒント

エラーを回避するための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 によってまだ保持されています。

これが役立つことを願って

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top