AS3:通过数组项引用删除对象

时间:2010-01-02 18:57:13

标签: flex actionscript-3

我正在尝试将一些Sprite对象添加为数组的内容,我希望能够从舞台上“清除”它们。我认为如果涉及加载器,我需要做

_imgArray[i].close();
_imgArray[i].unload();

如果我使用精灵,我可以这样做:

removeChild(_imgArray[i]);

以上工作都没有。 WHY ???

有关我如何设置的示例和/或说明,请参阅Joel的帖子here ...但请注意,他没有包含从视图中删除它们的参考。

目前我尝试:

for(i = 0; i < _localXML.length(); i++)
{
   var tmp:BMLink = new BMLink(_localXML[i], _bw, _bh, i);
   _imgArray[i] = tmp;
   _imgArray[i].x = (_bw + _mainpad) * i; 
   _base.addChild(_imgArray[i]);
}

但这不起作用。 如果有人能向我解释为什么这不是正确的语法,我会很高兴。 填充数组的类实例都是扩展精灵,但它们在w / progress事件等中都有自己的独立加载器。

JML

2 个答案:

答案 0 :(得分:0)

您可以使用destroy方法创建一个Interface IDestroy,该方法将管理所有清理/删除内容:

public interface IDestroy{
 function destroy():void;
}

public class MySprite extends Sprite implements IDestroy {
 ..
 public function destroy():void{
  // remove events
  ..
  // remove loader
  ..
  //remove from parent
  if (parent!==null){
   parent.removeChild(this);
  }
  // etc.. more cleaning
 }
}

然后当你有一个IDestroy实例的对象时,可以调用destroy方法

if (myObject is IDestroy){
 IDestroy(myObject).destroy();
}

或其他方式

var id:IDestroy=myObject as IDestroy;
if (id!==null)
   id.destroy();

编辑:

我不明白为什么我在评论中提供的任何方法都不起作用,但_base.removeChild(_imgArray[i])会:

addChildremoveChild仅接受DisplayObject作为参数,因此,如果您可以执行_base.addChild(_imgArray[i]),则表示_imgArray[i] 继承自DisplayObject _imgArray [i]有父母

所以var myDisplayObject:DisplayObject=_imgArray[i] as DisplayObject;不会返回null,你可以使用myDisplayObject.parent.removeChild(myDisplayObject);来解决你的问题的一般方法,而不依赖你的_base DisplayObjectContainer(MovieClip / Sprite /...)

答案 1 :(得分:0)

行;我终于通过一系列的反复试验弄明白了。 似乎我试图删除我的主类精灵(这个)的孩子,而不是我添加孩子的子精灵。

对不起噪音,但是如果你发现你做不到的话,那就是记录

this.removeChild(_imgArray[i]);

这不是因为你没有正确的语法,而是因为你可能没有

_imgArray[i] 

在您的显示列表层次结构的特定点...所以......

_base.removeChild(_imgArray[i]);

......在这种情况下工作。

JML