Flash AS3 - ошибка аргумента DisplayObject - попытка удалить и добавить загруженное содержимое

Я работаю с flash и as3, чтобы попытаться создать инструмент для загрузки / просмотра / загрузки фотографий. Я использую ссылку на файл для обработки функций просмотра / загрузки / выгрузки. На моем текущем этапе есть 2 окна загрузчика, в которые я загружаю выбранное пользователем изображение. Мне нужно иметь возможность удалить изображение и повторно выбрать другое, если пользователь решит.

Итак, в событии загрузки файла у меня есть этот код:

// Load Image into Editor Function.
function onMovieClipLoaderComplete(event:Event):void {
    var loadedContent:DisplayObject=event.target.content;
    currentLoader =event.target.loader as Loader;

    currentLoader.x=currentX;
    currentLoader.y=currentY;

    currentContent.buttonMode=true;
    currentContent.addChild(currentLoader);
    addChild(currentContent);

    currentLoader.mask = currentMask;

    addChild(replace_btn);
}

И на моей кнопке замены у меня есть:

replace_btn.addEventListener(MouseEvent.CLICK, replaceImage);

function replaceImage(event:Event):void {
    currentContent.removeChild(currentLoader);
    removeChild(currentContent);
}

При нажатии кнопки замены, когда она работает нормально, но когда я загружаю другое изображение в загрузчик - в следующий раз, когда я нажимаю кнопку замены (или в любой последующий раз), я получаю следующую ошибку аргумента в моем файле flash as3:

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

Кто-нибудь знает что это значит? Странно, что это происходит только во второй раз, а не в первый раз. Я думал, что если у меня: currentContent.addChild(currentLoader); addChild(currentContent); при загрузке, а затем просто currentContent.removeChild(currentLoader); removeChild(currentContent); при замене, это сработает?

Полный код as3 показан ниже, если это тоже помогает

Я изучаю flash всего 3-4 месяца, поэтому, пожалуйста, не торопитесь, и я прошу прощения, если мой код написан не лучшим образом! :)

Лорен

// Set Start Up Values.
var image1_loader:Loader = new Loader();
var image1_content:Sprite = new Sprite();
var image1_mask:Sprite = new Sprite(); image1_mask.graphics.beginFill(0x000000,1);         image1_mask.graphics.drawRect(54, 59, 330, 330); image1_mask.graphics.endFill();

var image2_loader:Loader = new Loader();
var image2_content:Sprite = new Sprite();
var image2_mask:Sprite = new Sprite(); image2_mask.graphics.beginFill(0x000000,1);     image2_mask.graphics.drawRect(384, 59, 330, 165); image2_mask.graphics.endFill();

var currentBtn;
var currentLoader;
var currentContent;
var currentMask;
var currentX;
var currentY;

replace_btn.visible=false;


// Define FileReference.
 var canvasImage:FileReference;


// Image Buttons Function.
image1_btn.addEventListener(MouseEvent.CLICK, start_fileRef);
image2_btn.addEventListener(MouseEvent.CLICK, start_fileRef);

image1_content.addEventListener(MouseEvent.MOUSE_DOWN, setCurrentSelection);
image2_content.addEventListener(MouseEvent.MOUSE_DOWN, setCurrentSelection);

function setCurrentSelection(e:MouseEvent):void {
if (e.currentTarget===image1_content){currentContent=image1_content;}
if (e.currentTarget===image2_content){currentContent=image2_content;}
}


// Browse File Function.
function start_fileRef(e:MouseEvent):void {
trace("onBrowse");
if (e.target===image1_btn){currentBtn=image1_btn; currentLoader=image1_loader;     currentContent=image1_content; currentMask=image1_mask; currentX=54; currentY=59;}
if (e.target===image2_btn){currentBtn=image2_btn; currentLoader=image2_loader; currentContent=image2_content; currentMask=image2_mask; currentX=384; currentY=59;}

canvasImage=new FileReference();
canvasImage.addEventListener(Event.SELECT, onFileSelected);
var imageTypeFilter:FileFilter = new FileFilter("JPG/PNG Files","*.jpeg; *.jpg;*.gif;*.png");
canvasImage.browse([imageTypeFilter]);
}

// Selected File Function.
function onFileSelected(event:Event):void {
trace("onFileSelected");
canvasImage.addEventListener(Event.COMPLETE, onFileLoaded);
canvasImage.addEventListener(ProgressEvent.PROGRESS, onProgress);

var canvasImageName = canvasImage.name;
canvasImage.load();
}


// File Progress Function.
function onProgress(event:ProgressEvent):void {
var percentLoaded:Number=event.bytesLoaded/event.bytesTotal*100;
trace("loaded: "+percentLoaded+"%");
}

// File Loaded Function.
function onFileLoaded(event:Event):void {
var fileReference:FileReference=event.target as FileReference;

var data:ByteArray=fileReference["data"];
trace("File loaded");
var movieClipLoader:Loader=new Loader();
movieClipLoader.loadBytes(data);
movieClipLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMovieClipLoaderComplete);

canvasImage.removeEventListener(Event.COMPLETE, onFileLoaded);
}

// Load Image into Editor Function.
function onMovieClipLoaderComplete(event:Event):void {
var loadedContent:DisplayObject=event.target.content;
currentLoader =event.target.loader as Loader;

currentLoader.x=currentX;
currentLoader.y=currentY;

currentContent.buttonMode=true;
currentContent.addChild(currentLoader);
addChild(currentContent);

currentLoader.mask = currentMask;

addChild(replace_btn);


// Reveal Retry Button over Hover Function //
currentContent.addEventListener(MouseEvent.ROLL_OVER, hover);
replace_btn.addEventListener(MouseEvent.ROLL_OVER, hover);
currentContent.addEventListener(MouseEvent.ROLL_OUT, unhover);
replace_btn.addEventListener(MouseEvent.ROLL_OUT, unhover);

function hover(event:Event):void {
    replace_btn.visible=true;
}
function unhover(event:Event):void {
    replace_btn.visible=false;
}

replace_btn.addEventListener(MouseEvent.CLICK, replaceImage);

function replaceImage(event:Event):void {
    currentContent.removeChild(currentLoader);
    removeChild(currentContent);
}

}

person Lauren Tilter    schedule 26.04.2012    source источник
comment
Неясно, хотите ли вы, чтобы replace_btn имел 2 разных действия (прослушиватели событий). Если это так, то в функции replaceImage вы должны удалить слушателя replaceImage, чтобы он не вызывался, когда он не нужен. Кроме того, если есть второй слушатель, удалите его перед добавлением replaceImage в качестве слушателя. Надеюсь, поможет   -  person Mircea    schedule 26.04.2012


Ответы (1)


Это currentContent.removeChild(currentLoader); должно быть в порядке, но removeChild(currentContent);, скорее всего, является источником проблемы. Поскольку вы добавили его как currentContent.addChild(currentLoader), вы также должны удалить с ним контейнер var (currentContent).

person paddotk    schedule 23.05.2012