2

みなさん、ハロウィン前のハッピー :)

今日の問題は、子オブジェクトを削除するときに表示される DisplayObject エラーです。ビデオ コンテナとビデオ コントロールを起動 (addChild) し、閉じるボタンを追加するコードがあります。閉じるボタンが正常に機能し、ビデオとコントロールが削除され、別のビデオを再度選択できるようになりましたが、2 回目の閉じるをクリックすると、次のエラーが表示されます。

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;
    }
}

これで私のムービーは正常に動作しますが、このエラーがバックグラウンドで発生し (そして出力ウィンドウに表示され)、最終的に他の場所で問題が発生するのではないかと心配しています :(

これを見てくれてありがとう!:)


更新: 修正済み! 問題は、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);
    }
}

このグラフィックが役立つかどうかはわかりませんが、 代替テキスト

4

5 に答える 5

2

エラーを回避するための 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");
    }
于 2009-10-30T20:38:38.237 に答える
1

これは、これを行うためのもう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;
}

繰り返しますが、これは推奨される方法ではありませんが、エラーなしで機能します。「nullオブジェクト参照にアクセスできません」というエラーが発生し始めた場合、以前の人が示唆しているように、イベントリスナーまたはその他の依存関係は引き続き問題のDisplayObject'sによって保持されます。

お役に立てれば

于 2009-10-31T15:45:14.380 に答える
1

これを試して:

 container.removeChild(container.videoContainer);
 container.removeChild(container.vc);
于 2009-10-30T20:15:12.637 に答える
1

リスナーを削除することはありますか? あなたはそれを複数回発射させている可能性があります。

于 2009-10-31T08:20:49.883 に答える
1

実際の問題を引き起こしているのは他のコードの一部であると感じています。このエラーは、まだ存在していないものを削除するために、videuPlaying 変数が別の場所で変更された場合に意味があります。この変数を他の場所で変更していないことを確認してください。

于 2009-10-31T01:28:44.250 に答える