我有一堆图像。 这些图像都被添加到精灵容器中:
var container:Sprite = new Sprite();
container.addChild(img);//added in a loop
addChild(container);
稍后,当我遍历容器以删除我说的图像时:
for(var i:int=0;i<container.numChildren;i++)
{
var currImg:Sprite = container.getChildAt(i) as Sprite;
container.removeChild(currImg);
}
仅删除部分图像。如果我跟踪container.numChildren,我会得到正确数量的图像。 有人有同样的问题吗?
答案 0 :(得分:5)
尝试按相反顺序删除它们。您可能缺少删除操作,因为您正在尝试在前向循环中删除它们。
for(var i:int=container.numChildren;i>=0;i--)
{
var currImg:Sprite = container.getChildAt(i) as Sprite;
container.removeChild(currImg);
}
答案 1 :(得分:3)
我也遇到过这个问题。这里真正错误的是你正在逐步浏览显示列表并在每次迭代时将其删除。在AVM2中,显示列表深度在此上下文中自动管理,当您移除子项时,将调整显示列表深度的其余部分。无论如何,解决方案是将其包装在while循环中:
while(container.numChildren > 0){
container.removeChildAt(0);
}
<强>更新强>
还有一个关于你的代码的说明。尽量不要对剪辑进行新的引用。这将导致闪存VM中的垃圾收集过程出现问题,这是自动执行的,只有使用弱引用解除引用或引用的对象才会被清除。因此,您可以执行以下操作之一:
for(var i:int=0;i<container.numChildren;i++)
{
var currImg:Sprite = container.getChildAt(i) as Sprite;
container.removeChild(currImg);
currImg = null;
}
或
for(var i:int=0;i<container.numChildren;i++)
{
container.removeChild(Sprite(container.getChildAt(i)));
}
答案 2 :(得分:1)
此代码可以使用:
while(container.numChildren > 0)
{
container.removeChildAt(0);
}
但是我想指出那个循环有什么问题,这样你才能理解发生了什么。将我在下面的代码中添加的跟踪添加到您的代码中。 :
for(var i:int=0;i<container.numChildren;i++)
{
trace (i + " : " + container.numChildren);
var currImg:Sprite = container.getChildAt(i) as Sprite;
container.removeChild(currImg);
}
你会看到每次循环时,孩子的数量会按预期减少。
但您需要了解的是,当删除子项时 - 容器的显示列表会以非常显着的方式发生变化。
以下是运行循环之前显示列表的外观示例 - 我前面的数字是它们在容器显示列表中的位置。
0-cat
1-dog
2-bird
3-cow
4-elephant
5-clown
现在,第一次通过循环,你删除了cat,因为它的位置在显示列表中为0。这是显示列表现在的样子:
0-dog
1-bird
2-cow
3-elephant
4-clown
请注意,显示列表索引已根据删除的子项进行了移位。设计显示列表上不能有间隙。
所以,下次循环时,i的值是1 - 对吗?这意味着“鸟”将从显示列表中删除,而不是狗,这可能是您所期望的。
所以这是下一次循环之后的显示列表:
0-dog
1-cow
2-elephant
3-clown
所以,是的。其中许多解决方案都可行。在这种情况下,我建议使用while循环。但我认为从这个问题中获得的真正知识就是理解这个问题。
答案 3 :(得分:1)
与@ Michael的答案类似,您的原始代码 缺少删除,因为您的“numChildren”大小正在减少,并且您的迭代器在每个循环中都在增加:
正如@Ascension Systems所说,这是最好的方法。
while(container.numChildren > 0){
container.removeChildAt(0);
}
但是如果你想在循环中进行,你需要反过来。
for(var i:int=container.numChildren;i>=0;i--){
container.removeChild(container.getChildAt(i));
}
为了说明原始代码中发生的情况,请注意以下示例,其中包含25个孩子:
如果你在前向循环中删除,那么就会发生这种情况(每次迭代):
i:0 Array length:24
i:1 Array length:23
i:2 Array length:22
i:3 Array length:21
i:4 Array length:20
i:5 Array length:19
i:6 Array length:18
i:7 Array length:17
i:8 Array length:16
i:9 Array length:15
i:10 Array length:14
i:11 Array length:13
//the remaining 12 items never get looped over...