제거 메소드를 사용할 때 오류가 발생합니다
-
22-07-2019 - |
문제
행복한 사전 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);
}
}
이 그래픽이 도움이되는지 모르지만 :
해결책
리스너를 제거한 적이 있습니까? 여러 번 발사 할 수 있습니다.
다른 팁
오류를 피하기위한 한 가지 방법은 다음과 같습니다.
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.
도움이 되었기를 바랍니다