ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
, поэтому у меня есть функция, которая работает в state1 и имеет
while(myCanvas.rawChildren.numChildren > 0){
myCanvas.rawChildren.removeChildAt(0);
}
//this code is definitely the problem....
Я могу перейти в состояние2, но когда я возвращаюсь в состояние1, я получаю сообщение об ошибке.
почему? функция, имеющая цикл while, запускается только при поиске чего-либо в state1, так почему же он запускается при возврате из state2?
редактировать ...
поэтому я протестировал функцию, которая запускается при инициализации приложения:
private function init():void{
trace(g);
if(g == true){
while(myCanvas.rawChildren.numChildren > 0){
myCanvas.rawChildren.removeChildAt(0);
}
g = false;
}
trace(g);
}
Он не должен запускаться, он возвращается в состояние1, но я все еще получаю сообщение об ошибке. Таким образом, пока цикл while выполняется один раз, находясь в состоянии1, я никогда не смогу вернуться в состояние1
.
<mx:states>
<mx:State name="contactform">
<mx:AddChild position="lastChild">
<mx:Canvas id="msgCanvas" backgroundColor="0xEEEEEE" height="121" y="158" width="800" fontWeight="normal" fontSize="12" backgroundAlpha="0.02" x="0">
</mx:Canvas>
</mx:AddChild>
<mx:AddChild position="lastChild">
<custom:email_cmp x="150" y="287" height="213"/>
</mx:AddChild>
</mx:State>
<mx:State name="main">
<mx:AddChild position="lastChild">
<mx:Canvas id="myCanvas" backgroundColor="0xEEEEEE" height="342" y="158" width="800" fontWeight="normal" fontSize="12" backgroundAlpha="0.02" x="0">
</mx:Canvas>
</mx:AddChild>
</mx:State>
</mx:states>
public function mainFunction():void{
origArray = [];
var cache:int = 0;
if(myCanvas.rawChildren.numChildren > 0){
myCanvas.rawChildren.removeChildAt(0);
}
//text format for links
var hFormat:TextFormat = new TextFormat();
hFormat.font = "Verdana";
hFormat.color = 0x000000;
hFormat.size = 15;
//text format end
var sprite1:Sprite = new Sprite();
var textQ:TextField = new TextField();
textQ.mouseEnabled = false;
if(amt_cnt.count == 1){
amt_cnt.end = amt_cnt.endCache;
amt_cnt.start = amt_cnt.startCache;
//set the text
textQ.defaultTextFormat = hFormat;
textQ.text = "Still can't find your answer? Need more help?";
textQ.x = 270;
textQ.y = 300;
textQ.width = textQ.textWidth +20;
textQ.selectable = false;
sprite1.addChild(textQ);
sprite1.buttonMode = true;
myCanvas.rawChildren.addChild(sprite1);
sprite1.addEventListener(MouseEvent.CLICK, moreHelp);
}else{
amt_cnt.end = amt_cnt.endCache;
amt_cnt.start = amt_cnt.startCache;
textQ.defaultTextFormat = hFormat;
textQ.text = "More Questions...";
textQ.x = 275;
textQ.y = 300;
textQ.width = textQ.textWidth +20;
textQ.selectable = false;
sprite1.addChild(textQ);
sprite1.buttonMode = true;
myCanvas.rawChildren.addChild(sprite1);
sprite1.addEventListener(MouseEvent.CLICK, moreQuestions);
}
var fontSize:int = 12;
//text formatting for the displayed question list Begin
var qFormat:TextFormat = new TextFormat();
qFormat.font = "Verdana";
qFormat.color = 0x000000;
qFormat.size = fontSize;
//ending text format
for(var t:uint = amt_cnt.start; t<amt_cnt.end; t++){
/*if(t == 0){
var topQ:TextField = new TextField();
topQ.text = full_array[t][1];
mainQsprite.addChild(topQ);
}*/
var qSprite:Sprite = new Sprite();
var txt:TextField = new TextField();
txt.defaultTextFormat = qFormat;
txt.text = full_array[t][0];
txt.selectable = false;
txt.mouseEnabled = false;
txt.border = false;
txt.width = 500; // how wide you want the text to go.
var numLines:Number = Math.floor(txt.textWidth/txt.width)+1; //calculates number of lines of the textfield.
txt.height = ((fontSize+8)*numLines);
txt.wordWrap = true;
qSprite.x = 30;
qSprite.y = 350;
qSprite.alpha = 0;
var temp_a:Number = cache; //20 is the padding between questions displayed
if(t != amt_cnt.end-1){
Tweener.addTween(qSprite, {y:temp_a, alpha:1, time:1, delay:t*0.1, transition:"easeoutexpo"}); //tweener INNNNN!
}else{
Tweener.addTween(qSprite, {y:temp_a, alpha:1, time:1, delay:t*0.1, transition:"easeoutexpo", onComplete:runTop}); //tweener INNNNN!
}
cache = txt.height + temp_a;
qSprite.buttonMode = true;
origArray[t] = new Array(qSprite.x,temp_a, qSprite);
mainDict[qSprite] = new Object();
mainDict[qSprite].question = full_array[t][0];
mainDict[qSprite].answer = full_array[t][1];
mainDict[qSprite].count = full_array[t][2];
mainDict[qSprite].top = full_array[t][3];
mainDict[qSprite].origX = qSprite.x;
mainDict[qSprite].origY = temp_a;
mainDict[qSprite].id = t;
mainDict[qSprite].height = txt.height;
amt_cnt[t] = new Object();
amt_cnt[t].hit = false;
qSprite.addChild(txt);
qSprite.addEventListener(MouseEvent.CLICK, clicked);
qSprite.addEventListener(MouseEvent.MOUSE_OVER, over);
qSprite.addEventListener(MouseEvent.MOUSE_OUT, out);
myCanvas.rawChildren.addChild(qSprite);
if(full_array[t][3] == true){
var thereIsTop:Boolean = true;
}
}
amt_cnt.array = origArray;
/*if(thereIsTop == true){
topAnswer(); //makes the top answer open first
thereIsTop = false;
}*/
}
Так что это основная функция. Верхняя часть имеет состояния. Основное состояние загружается первым и имеет холст myCanvas. Все в mainfunction добавляет myCanvas.
Я впервые работаю с flex, поэтому скажите, есть ли лучший способ сделать это. Спасибо?
Мне действительно нужно решить это. Я напрягался из-за этого в течение нескольких недель.