добавление дочернего элемента с помощью getChildByName? - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть следующая переменная:

private var fotoSlide:FotoSlide;

и я делаю в своем коде следующее:

var data:Object = _dataProvider[0];
trace(data.type);//This gives back the string Foto
var slide:Sprite = new (getChildByName(data.type+"Slide"));
addChild(slide);

Так что, если я объявляю свою переменную с помощью getChildByName, результатом должен быть FotoSlide. Но это не похоже на работу. Я думаю, что это связано с тем, что getChildByName можно использовать только тогда, когда ребенок добавлен на сцену? Не уверен, что ты. Кто-нибудь, кто знает, в чем проблема?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2010

попробуйте изменить

var slide:Sprite = new (getChildByName(data.type+"Slide"));

на

var slide:Sprite = new Sprite(getChildByName(data.type+"Slide"));
0 голосов
/ 04 декабря 2010

Вам нужно использовать getDefinitionByName, который при условии, что класс существует, вернет класс Object, который вы можете затем создать.

  var ClassName:Object = getDefinitionByName("ClassName");
  var instance:Sprite = new ClassName();

В вашем случае:

   var data:Object = _dataProvider[0];

   var FotoSlideClass:Object = getDefinitionByName(data.type+"Slide");
   var slide:Sprite = new FotoSlideClass();
   addChild(slide);
0 голосов
/ 03 декабря 2010

getChildbyName ищет детей в списке отображения, а не переменных-членов.Похоже, вы пытаетесь использовать его для размышления, а это не то, что он делает.

Чего вы на самом деле пытаетесь достичь здесь?Если у него просто есть способ создать тип на основе строки, тогда вы можете сделать простой оператор switch:

// Assuming all *Slide objects implement ISlide
private function buildSlide(type:String):ISlide {
  switch (type) {
    case "Foto":
      return new FotoSlide();
    case "Text":
      return new TextSlide();
    // ...
  }
}

var data:Object = _dataProvider[0];
trace(data.type);//This gives back the string Foto
var slide:Sprite = this.builderSlide(data.type);
addChild(slide);

Или создать хеш с функциями, которые возвращают новый элемент этого типа.Например:

private var builders:Object = {
  "Foto" : function() { return new FotoSlide(); },
  "Text": function() { return new TextSlide(); },
  // ...
};

var data:Object = _dataProvider[0];
trace(data.type);//This gives back the string Foto
var slide:Sprite = this.builders[data.type]();
addChild(slide);

Возможно, вы захотите провести некоторую проверку значения data.type, чтобы убедиться, что это ожидаемый тип, в зависимости от степени доверия источнику данных.

Первыйнемного более безопасен, но оба должны работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...