Dans Flex / AS3, comment obtenir une définition de classe d'un actif incorporé avec getDefinitionByName

StackOverflow https://stackoverflow.com/questions/87557

Question

J'ai une classe avec de nombreux actifs incorporés.

Dans la classe, j'aimerais connaître la définition de classe d'un actif par son nom. J'ai essayé d'utiliser getDefinitionByName (), et aussi ApplicationDomain.currentDomain.getDefinition (), mais aucun des deux ne fonctionne.

Exemple:

public class MyClass
{
  [Embed(source="images/image1.png")] private static var Image1Class:Class;
  [Embed(source="images/image2.png")] private static var Image2Class:Class;
  [Embed(source="images/image3.png")] private static var Image3Class:Class;

  private var _image:Bitmap;

  public function MyClass(name:String)
  {
    var ClassDef:Class = getDefinitionByName(name) as Class;  //<<-- Fails
    _image = new ClassDef() as Bitmap;    
  }
}

var cls:MyClass = new MyClass("Image1Class");
Était-ce utile?

La solution

Cela ne répond pas à votre question, mais cela pourrait résoudre votre problème. Je pense que faire quelque chose comme ça devrait marcher:

public class MyClass
{
  [Embed(source="images/image1.png")] private static var Image1Class:Class;
  [Embed(source="images/image2.png")] private static var Image2Class:Class;
  [Embed(source="images/image3.png")] private static var Image3Class:Class;

  private var _image:Bitmap;

  public function MyClass(name:String)
  {
    _image = new this[name]() as Bitmap;    
  }
}

var cls:MyClass = new MyClass("Image1Class");

J'ai de la difficulté à me souvenir si la notation entre crochets fonctionne pour les classes scellées. Si ce n’est pas le cas, une solution simple consiste à marquer la classe comme dynamique.

Autres conseils

La raison pour laquelle votre méthode ne fonctionne pas est parce que "Image1Class". est un nom de variable et non le nom de classe actuel .

Vous pouvez obtenir le nom de la classe comme ceci

import flash.utils.getQualifiedClassName;
trace(getQualifiedClassName(Image1Class));

Ce qui, comme vous pouvez le constater, signifie que le nom de votre classe (celui qui doit être passé dans la fonction) est quelque chose comme MyClass_Image1Class .

Vous n'avez pas besoin d'utiliser de méthodes fantaisistes getDefinitionByName (), il vous suffit de vous y référer de manière dynamique. Dans votre cas, remplacez la ligne "Echec" par:

var classDef:Class = MyClass[name] as Class;

Et cela devrait le faire.

Merci beaucoup! Je viens de passer près de 5 heures à essayer de faire en sorte que le POS getDefinitionByName fonctionne avec le getQualifiedClassName que j'étais prêt à lancer des trucs !! Mon code de travail final ressemble à ceci et obtient même le nom de la chaîne d'un tableau.

CreatureParam est un tableau de chaînes en 2 dimensions;

Le type est un entier envoyé à Flash par une balise HTML qui provient d'une base de données MYSQL via PHP.

Mark1_cb est une liste déroulante présente sur la scène et portant un nom d'instance. Sa sortie est aussi un entier.

Ainsi, ce code directement sous la classe importe la classe "BirdBodyColor_mc". à partir d'un fichier "ArtLibrary.swf" externe swf externe. BirdBodyColor_mc est un MovieClip créé à partir d'une image png. Notez que vous devez double-cliquer sur le MovieClip dans le fichier ArtLibrary.fla et insérer une seconde image clé. Movieclips a apparemment besoin de deux images ou Flash essaie de l'importer en tant qu'image-objet et provoque une disparité de type.

[Incorporer (source = "ArtLibrary.swf", symbole = "BirdBodyColor_mc")] var BirdBodyColor_mc: Class;

Normalement, je mettrais une instance de cette classe de movieclip sur la scène en utilisant ce code.

myMC: MovieClip = new BirdBodyColor_mc (); addChild (myMC);

var Définition: Class = this [" BirdBodyColor_mc "]] en tant que classe; var Mark1: MovieClip = new Definition ();

Mais je dois le faire en utilisant une valeur de chaîne recherchée dans mon tableau. Donc, voici le code pour cela.

var Définition: Class = this [CreatureParam [Type] [Mark1_cb + 2]] en tant que classe; var Mark1: MovieClip = new Definition ();

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top