我创建了一个精灵列表(用于保存文本字段),如何删除所有创建的精灵?
创建精灵:
for (var i:int = 0; i < optionsArray[currentChoicePart].length; i++)
{
var txt:TextField = new TextField();
txt.defaultTextFormat = new TextFormat('Verdana',15,0xFFFFFF);
txt.text = optionsArray[currentChoicePart][i];
txt.filters = [stroke];
txt.autoSize = TextFieldAutoSize.LEFT;
txt.selectable = false;
txt.width = 400
txt.height = 25
var btn:Sprite = new Sprite();
btn.mouseChildren = false;
btn.addChild(txt);
btn.buttonMode = true;
btn.x = stage.stageWidth / 10
btn.y = stage.stageHeight / 2 - 50 * (i * .5)
btn.name = "p" + String((Number(currentPart.substring(1)) + (i+1)))
stage.addChild(btn)
btn.addEventListener(MouseEvent.CLICK, function m(zen:MouseEvent) // when button is clicked
{
choice(zen.currentTarget.name)
}
)
}
答案 0 :(得分:1)
整个方法都是错误的,你的代码编写方式只会给你带来比实际应该更多的麻烦。您只需要一种特殊的方法来删除这些按钮,因为您自己创建了这种情况。实际上,更简单,更有效的代码是将按钮设置在特定的精灵中,然后简单地删除该精灵中的所有按钮,如:
var buttonHolder:Sprite = new Sprite();
stage.addChild(buttonHolder);
//for loop
for (var i:int = 0; i < optionsArray[currentChoicePart].length; i++)
//etc ...
buttonHolder.addChild(btn);
//here the button is added to his specific holder
没有删除按钮变得非常容易
buttonHolder.removeChildren();
直接将所有内容添加到舞台上是编码员缺乏经验的线索。什么都不应该被添加到舞台上。您应该添加更多图层(Sprite),然后根据需要添加到这些图层,而不是文档类。最终得到一个非常容易管理的显示列表和一组图层。加入舞台将使你的工作和逻辑变得更加困难,并且充满了令人头疼的问题。
编辑:
不建议通过显示列表或数组循环以删除或添加它,因为它很棘手并且很容易产生错误。如果添加或删除元素更改的数量,依赖于该数字的循环可能会产生奇怪的结果。如果你删除那么循环将很快终止缺少一些要删除的元素。相反,通常使用while循环来避免此问题。
while(buttonHolder.numChildren)
{
buttonHolder.removeChildAt(0);
}
此外,必须像这样调用removeChildren方法
removeChildren();
不喜欢这样:
removeChildren;//missing ()
答案 1 :(得分:0)
在一个地狱中,我建议保存某个地方按钮的链接(例如Vector。),当你需要删除所有按钮时,只需浏览列表。
试试这段代码(请注意评论):
import flash.display.Sprite;
var btns:Vector。 = new Vector。();
function init():void
{
trace("init");
for (var i:int = 0; i < optionsArray[currentChoicePart].length; i++)
{
var txt:TextField = new TextField();
txt.defaultTextFormat = new TextFormat('Verdana',15,0xFFFFFF);
txt.text = optionsArray[currentChoicePart][i];
txt.filters = [stroke];
txt.autoSize = TextFieldAutoSize.LEFT;
txt.selectable = false;
txt.width = 400
txt.height = 25
var btn:Sprite = new Sprite();
btn.mouseChildren = false;
btn.addChild(txt);
btn.buttonMode = true;
btn.x = stage.stageWidth / 10
btn.y = stage.stageHeight / 2 - 50 * (i * .5)
btn.name = "p" + String((Number(currentPart.substring(1)) + (i+1)))
stage.addChild(btn)
btn.addEventListener(
MouseEvent.CLICK,
function m(zen:MouseEvent) // when button is clicked
{
choice(zen.currentTarget.name);
}
)
// Each button is put in the list,
// to be able to work with the button after
btns.push(btn);
}
trace(btns.length);
}
function reset():void
{
trace("reset");
var tempBtn:Sprite;
var btnsCount:int = btns.length;
// We just go through the list and remove all buttons from theirs parents
for(var btnIndex:int = 0; btnIndex < btnsCount; btnIndex++)
{
tempBtn = btns[btnIndex];
tempBtn.parent.removeChild(tempBtn);
}
btns = new Vector.<Sprite>();
}
init();
setTimeout(reset, 3000);
另外,我用注释行测试了上面的代码,其中我没有变量,例如optionsArray,stroke,e.t.c。