Flash AS3: предоставленный DisplayObject должен быть дочерним объектом вызывающей ошибки

#flash #actionscript-3

#flash #actionscript-3

Вопрос:

Я создаю некоторый сценарий действия для имитации трех состояний кнопки и загрузки в видеофрагментах соответственно.

Я получаю эту ошибку

 ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
    at flash.display::DisplayObjectContainer/removeChild()
    at Untitled_fla::MainTimeline/sack_btnMouseOut()
  

При попытке сделать это

 //get the objects
var addSackStill:sack_still = new sack_still();
var addSackHover:sack_hover = new sack_hover();
var addSackClick:sack_click = new sack_click();

//add the still object to the stage
addChild(addSackStill);
var SACK_X = 570.55;
var SACK_Y = 603.95;
addSackStill.x = SACK_X;
addSackStill.y = SACK_Y;
addSackHover.x = SACK_X;
addSackHover.y = SACK_Y;
addSackClick.x = SACK_X;
addSackClick.y = SACK_Y;

//create the event listeners
addSackStill.addEventListener(MouseEvent.MOUSE_OVER, sack_btnMouseOver);
addSackHover.addEventListener(MouseEvent.MOUSE_OUT, sack_btnMouseOut);
addSackHover.addEventListener(MouseEvent.CLICK, sack_btnClick);


//here are the functions for mouse over, mouse off, and click
function sack_btnMouseOver(event:MouseEvent):void {
    trace("mouse over");
    removeChild(addSackStill); //remove the movie clip
    addChild(addSackHover); //add sackclick to the stage
}

function sack_btnMouseOut(event:MouseEvent):void {
    trace("mouse out");
    removeChild(addSackHover); //remove the movie clip
    addChild(addSackStill); //add sackclick to the stage
}

function sack_btnClick(event:MouseEvent):void {
    trace("Click");
    removeChild(addSackHover); //remove the movie clip
    addChild(addSackStill); //add sackclick to the stage
}
  

Я делаю что-то не так?

Комментарии:

1. Обычно я получаю эту ошибку, если вызываю removeChild из объекта, который пытаюсь удалить.. Попробуйте обернуть removeChild в if(thing.parent) thing.parent.removeChild(thing);

Ответ №1:

Я предполагаю, что они не добавляются, когда вы пытаетесь их удалить. Убедитесь, что родители существуют, прежде чем удалять их. Кроме того, вы можете попробовать parent.removeChild, а не удалять этот объект:

 //here are the functions for mouse over, mouse off, and click
function sack_btnMouseOver(event:MouseEvent):void {
    trace("mouse over");
    if (addSackStill.parent) { addSackStill.parent.removeChild(addSackStill); } //remove the movie clip
    addChild(addSackHover); //add sackclick to the stage
}

function sack_btnMouseOut(event:MouseEvent):void {
    trace("mouse out");
    if (addSackHover.parent) { addSackHover.parent.removeChild(addSackHover); } //remove the movie clip
    addChild(addSackStill); //add sackclick to the stage
}

function sack_btnClick(event:MouseEvent):void {
    trace("Click");
    if (addSackHover.parent) { addSackHover.parent.removeChild(addSackHover); } //remove the movie clip
    addChild(addSackStill); //add sackclick to the stage
}
  

Комментарии:

1. Я думаю, если бы это было так, вместо этого была бы выдана ошибка ссылки на нулевой объект?

2. Это касается обеих возможностей — как нулевого родителя, так и не родителя удаленного дочернего объекта….