添加“getChildByName”的孩子?

时间:2010-12-03 16:13:00

标签: actionscript-3

我有一个变量如下:

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 :(得分:0)

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值进行一些验证,以确保它是预期的类型,具体取决于您对数据源的信任程度。

前者有点类型安全,但两者都应该有用。

答案 1 :(得分:0)

尝试更改

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

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

答案 2 :(得分:0)

你需要使用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);