Frage

Happy Pre-Halloween alle:)

Mein Problem ist heute ein Display Fehler ich immer bin, wenn ein Kind Objekt entfernen. Ich habe Code, der gestartet wird (addChild) einen Video-Container und Videosteuerung sowie eine Schließen-Schaltfläche hinzufügen. Jetzt die Schließen-Schaltfläche funktioniert gut und alles , Entfernen der Video- und Kontrollen, und ich bin Lage wieder ein weiteres Video zu wählen, aber wenn Sie auf ein 2. Mal schließen bekomme ich diesen Fehler:

Argument: Error # 2025: Die mitgelieferte Display muss ein Kind des Anrufers sein. bei flash.display :: Display / removeChild ()

Also ich habe verengt das Problem, wo ich die videoContainer entfernen (die das Video-Objekt hält)

Mein Code, um die Videos zu spielen:

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

Die enge aus Video-Player-Code: Sie können in meinen Kommentaren anderer Code sehe ich versucht, aber immer noch den Fehler.

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

Jetzt meinen Film funktioniert gut, aber ich mache mir Sorgen, dass dieser Fehler passiert im Hintergrund (und in meinem Ausgabefenster nach oben zeigt) wird schließlich ein Problem verursacht sonst wo: (

Vielen Dank im Voraus für alle Augen auf diese! :)


UPDATE: FEST Das Problem war ich die Kill VC Zuhörer zu entfernen, aber vergessen, die dummen Close Button mouse_event Zuhörer zu entfernen: (

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

Sie wissen nicht, ob diese Grafik hilft aber: alt text

War es hilfreich?

Lösung

Nehmen Sie jemals den Hörer? Man könnte auch sein, die es mehrmals feuern.

Andere Tipps

Hier ist ein Ansatz, um den Fehler zu vermeiden:

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

Versuchen Sie folgendes:

 container.removeChild(container.videoContainer);
 container.removeChild(container.vc);

Ich habe das Gefühl, dass es ein anderes Stück Code ist das eigentliche Problem verursacht. Dieser Fehler würde Sinn machen, wenn die videuPlaying Variable woanders geändert wurde, so dass Sie etwas wurden entfernt, die noch nicht existierte. Vielleicht überprüfen, ob Sie diese Variable nicht ändern sich woanders.

Dies ist ein weiterer uber hacky Weg, dies zu tun, nicht in der Regel empfohlen, aber es wird auf jeden Fall sicherstellen, dass die videoContainer / vc entfernt wird, von welcher DisplayList es eingeschaltet ist.

private function removeFromStack(target:DisplayObject):void
{
    if (target.parent)
        target.parent.removeChild(target);
}

private function removeVideo():void
{
    removeFromStack(vc);
    removeFromStack(videoContainer);
    vc = videoContainer = null;
}

Just neu itterate, ist dies nicht die bevorzugte Art und Weise, aber es wird ohne Fehler arbeiten. Wenn Sie eine bekommen starten „nicht null Objektverweis Zugriff auf“ Fehler, dann als vorherig Leute haben vorgeschlagen, Ereignis-Listener oder einige andere Abhängigkeiten noch durch die DisplayObject's in Frage gehalten werden.

Hope, das hilft

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top