2010-12-03 5 views
0

J'ai une variable comme suit:ajouter un enfant avec "getChildByName"?

private var fotoSlide:FotoSlide; 

et je fais ce qui suit dans mon code:

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

Donc, si je suis en déclarant ma variable avec getChildByName le résultat devrait être fotoslide. Mais cela ne semble pas fonctionner. Je pense qu'il doit faire parce que getChildByName peut seulement être utilisé quand un enfant est ajouté à la scène? Pas sûr de toi. Quelqu'un qui sait quel est le problème?

Répondre

0

getChildbyName cherche des enfants dans la liste d'affichage, pas des variables membres. On dirait que vous essayez de l'utiliser pour la réflexion, ce qui n'est pas le cas.

Qu'essayez-vous réellement d'accomplir ici? S'il est juste d'avoir un moyen de construire un type basé sur la chaîne alors que vous pourriez faire une déclaration simple interrupteur:

// 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); 

Ou, créez un hachage avec des fonctions qui renvoient un nouvel élément de ce type. Par exemple:

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); 

Vous pouvez faire une validation de la valeur data.type pour vous assurer qu'il est un type prévu, selon la façon dont vous beaucoup confiance à la source de données.

Le premier est un peu plus sûr, mais les deux devraient fonctionner.

0

essayer de changer

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

à

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

Je suis assez certain que ne fonctionne toujours pas. 'FotoSlide' n'est pas un enfant de la liste d'affichage de la classe, ni même une classe enfant. La variable 'fotoSlide' existe, mais cela ne crée pas de correspondance réelle que' getChildByName' pourrait utiliser. – Herms

0

Vous devez utiliser getDefinitionByName qui, à condition que la classe existe retourne l'objet de classe que vous pouvez instancier.

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

Dans votre cas:

var data:Object = _dataProvider[0]; 

    var FotoSlideClass:Object = getDefinitionByName(data.type+"Slide"); 
    var slide:Sprite = new FotoSlideClass(); 
    addChild(slide); 
Questions connexes