我有一个变量如下:
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只能在将子项添加到舞台时使用?不确定你。谁知道问题是什么?
答案 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);