Domanda

Buon pre-Halloween a tutti :)

Il mio problema oggi è un errore DisplayObject che visualizzo quando rimuovo un oggetto figlio. Ho un codice che avvierà (addChild) un contenitore video e controlli video e aggiungerà un pulsante di chiusura. Ora il pulsante di chiusura funziona bene e tutto , rimuovendo il video e i controlli e sono in grado di scegliere di nuovo un altro video, ma quando fai clic su Chiudi una seconda volta ottengo questo errore:

ArgumentError: errore n. 2025: l'oggetto DisplayObject fornito deve essere figlio del chiamante. at flash.display :: DisplayObjectContainer / removeChild ()

Quindi ho ridotto il problema a dove rimuovo videoContainer (che contiene l'oggetto video)

Il mio codice per riprodurre i video:

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

Il codice del lettore video di chiusura: Puoi vedere nei miei commenti altro codice che ho provato, ma che continua a ricevere l'errore.

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

Ora il mio film funziona bene, ma sono preoccupato che si verifichi questo errore in background (e visualizzato nella mia finestra di output) alla fine causerà un altro problema in cui :(

Grazie in anticipo per tutti gli occhi su questo! :)


UPDATE: RISOLTO! Il problema è stato che ho rimosso il listener kill VC, ma ho dimenticato di rimuovere lo stupido pulsante Chiudi Listener 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);
    }
}

Non so se questo grafico aiuta ma: alt text

È stato utile?

Soluzione

Hai mai rimosso l'ascoltatore? Potresti farlo sparare più volte.

Altri suggerimenti

ecco un approccio per evitare l'errore:

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

Prova questo:

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

Ho la sensazione che sia un altro pezzo di codice a causare il vero problema. Questo errore avrebbe senso se la variabile videuPlaying fosse cambiata da qualche altra parte in modo da rimuovere qualcosa che non esisteva ancora. Forse controlla che non stai modificando questa variabile da qualche altra parte.

Questo è un altro modo superbo di farlo, di solito non raccomandato, ma assicurerà definitivamente che il videoContainer / vc sia rimosso da qualunque DisplayList sia acceso.

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

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

Solo per reiterare, questo non è il modo preferito, ma funzionerà senza errori. Se inizi a ottenere un " impossibile accedere al riferimento a oggetto null " errore, quindi, come suggerito dalle persone precedenti, i listener di eventi o altre dipendenze sono ancora trattenuti dai DisplayObject ' in questione.

Spero che questo aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top