문제

행복한 사전 halloween 모두 :)

오늘 내 문제는 자식 객체를 제거 할 때 얻는 DisplayObject 오류입니다. 비디오 컨테이너 및 비디오 컨트롤을 시작하고 닫기 버튼을 추가 할 코드가 있습니다. 이제 닫기 버튼은 잘 작동합니다, 비디오 및 컨트롤을 제거하면 다른 비디오를 다시 선택할 수 있지만 두 번째 시간을 클릭하면이 오류가 발생합니다.

ArgumentERROR : 오류 #2025 : 제공된 displayObject는 발신자의 자녀 여야합니다. at 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 리스너를 제거했지만 어리석은 닫기 버튼을 제거하는 것을 잊어 버렸다는 것입니다.

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

도움이 되었습니까?

해결책

리스너를 제거한 적이 있습니까? 여러 번 발사 할 수 있습니다.

다른 팁

오류를 피하기위한 한 가지 방법은 다음과 같습니다.

    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 변수가 다른 곳으로 변경되어 아직 존재하지 않은 것을 제거하는 경우이 오류가 적합합니다. 이 변수를 다른 곳에서 변경하지 않는지 확인하십시오.

이것은이 작업을 수행하는 또 다른 Uber Hacky 방법입니다. 일반적으로 권장되지는 않지만 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.

도움이 되었기를 바랍니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top