Дочерний элемент AS3 с текстовыми полями, отображающими только последнее добавленное

#flash #actionscript #addchild

#flash #actionscript #addchild

Вопрос:

Я создаю клиент Facebook в actionscript, и у меня возникла проблема. У меня есть этот блок кода:

         var loader:URLLoader = URLLoader(event.target);

        var feedResponse:String = (event.target.data);
        var object:Object = JSON.decode(feedResponse); //getting the data

        var friendsStatus:Array = new Array(); //array for status'
        var friendsName:Array = new Array(); //array for names

        var startX:int = 120;
        var startY:int = 100;

        var myFormat:TextFormat = new TextFormat();
        myFormat.size = 16;

        var statusMessage:TextField = new TextField();
        statusMessage.defaultTextFormat = myFormat;
        statusMessage.wordWrap = true;
        statusMessage.width = 600;

        var faceFriend:TextField = new TextField();
        faceFriend.defaultTextFormat = myFormat;
        faceFriend.wordWrap = true;
        faceFriend.width = 300;

        for(var i:int = 0; i < 10; i  )
        {
            if(object.data[i].message == undefined){
                var userStory:String = object.data[i].story; // mowing through the facebook JSON response
                friendsStatus[i] = userStory;
            } else {
                var userStatus:String = object.data[i].message;
                friendsStatus[i] = userStatus;
            }

            var fName:String = object.data[i].from.name;
            friendsName[i] = fName;
        } 

        for(var j:int; j < 10; j  ) // The headache loop
        {
            faceFriend.x = startX;
            faceFriend.y = startY;

            faceFriend.text = friendsName[j]; //assign the current name to the TextField text property
            addChild(faceFriend); //add it to the stage
            startY  = 30; //increase the y value so they dont overlap
            trace(startY);
            trace(faceFriend.text);
            trace("");

            statusMessage.x = startX;
            statusMessage.y = startY;

            statusMessage.text = friendsStatus[j]; //same here for the status'
            addChild(statusMessage);
            startY  = 20;
            trace(startY);
            trace(statusMessage.text);
            trace("");
        }
  

который должен перебирать набор статусов, присваивать их переменным и добавлять их на сцену. Однако все, чего я добиваюсь, — это самый последний статус, добавляемый на сцену.
Как вы можете видеть из всех трассировок, я обнаружил, что все массивы содержат правильную информацию, а значение y (поэтому оно не все друг над другом) выполняется правильно. Он просто отказывается позволять видеть что-либо, кроме конечного текстового поля: (

Есть идеи?

PS Я понимаю, что это не совсем блестящий код — заранее извините за головную боль: P

Ответ №1:

Вам необходимо создать

 var faceFriend:textField inside the loop.
  

В настоящее время вы создаете одно текстовое поле и манипулируете им снова и снова. Что вызывает проблему. Этот код сгенерирует 10 полей и выровняет их по горизонтали.

 var faceFriend:TextField;

for(var i:uint;i<10;i  )
{
    faceFriend = new TextField();
    faceFriend.x = i*20;
    addChild(faceFriend);
}
  

в то время как этот код сгенерирует одно поле, манипулируйте им 10 раз и покажите вам одно поле, что, по сути, вы и делаете.

 var facefriend:TextField = new TextField();

 for(var i:uint;i<10;i  )
 {
    faceFriend.x = i*20;
    addChild(faceFriend);
 }
  

Это

Комментарии:

1. Вау, большое вам спасибо, ребята, это исправило мою проблему 🙂 Не могу поверить, что я об этом не подумал!

Ответ №2:

Что вы делаете сейчас, так это создаете только 1 экземпляр. Затем вы устанавливаете позицию в цикле, поэтому перемещается тот, который вы создали изначально.

Чтобы создать 10 текстовых полей, вам необходимо создать экземпляр внутри цикла.

Итак, вам нужно будет сделать

 for(var i:int=0; i<10; i  ) {
var faceFriend:TextField = new TextField();
faceFriend.defaultTextFormat = myFormat;
faceFriend.wordWrap = true;
faceFriend.width = 300;
//Everything else
}