Question

Joyeux pré-Halloween à tous:)

Mon problème aujourd'hui est une erreur DisplayObject que je reçois lors de la suppression d'un objet enfant. J'ai le code qui lancera (addChild) un conteneur vidéo et des contrôles vidéo, ainsi qu'un bouton de fermeture. Le bouton de fermeture fonctionne correctement et tout le reste , ce qui supprime la vidéo et les contrôles. capable de choisir une autre vidéo à nouveau, mais lorsque vous cliquez sur fermer une deuxième fois, je reçois cette erreur:

ArgumentError: Erreur n ° 2025: l'objet DisplayObject fourni doit être un enfant de l'appelant. sur flash.display :: DisplayObjectContainer / removeChild ()

J'ai donc limité le problème à l'endroit où je supprime le conteneur vidéo (qui contient l'objet vidéo)

Mon code pour lire les vidéos:

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

Code du lecteur vidéo de fermeture: Vous pouvez voir dans mes commentaires un autre code que j'ai essayé, mais j'ai toujours l'erreur.

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

Maintenant, mon film fonctionne correctement, mais je crains que cette erreur ne se produise. en arrière-plan (et apparaissant dans ma fenêtre de sortie) finira par poser un problème où: (

Merci d'avance pour tout regard sur celui-ci! :)

MISE À JOUR: FIXED! Le problème était que je supprimais l'écouteur de suppression de VC, mais que j'avais oublié de supprimer l'écouteur stupide Bouton Fermer 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);
    }
}

Je ne sais pas si ce graphique aide, mais: alt text

Était-ce utile?

La solution

Avez-vous déjà retiré l'auditeur? Vous pourriez bien avoir le feu plusieurs fois.

Autres conseils

voici une approche pour éviter l'erreur:

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

Essayez ceci:

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

J'ai l'impression que c'est un autre morceau de code qui cause le problème. Cette erreur aurait un sens si la variable videuPlaying était modifiée ailleurs afin de supprimer quelque chose qui n'existait pas encore. Vérifiez peut-être que vous ne modifiez pas cette variable ailleurs.

C’est un autre moyen extrêmement astucieux de le faire, ce n’est généralement pas recommandé, mais cela assurera définitivement que videoContainer / vc est supprimé de la DisplayList sur laquelle il est activé.

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

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

Juste pour répéter, ce n’est pas la méthode préférée, mais cela fonctionnera sans erreur. Si vous commencez à obtenir un " impossible d'accéder à la référence d'objet null " erreur, alors, comme d'autres personnes l'ont suggéré, les écouteurs d'événement ou d'autres dépendances sont toujours conservés par les DisplayObject ' en question.

J'espère que cela vous aidera

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top