In Flex/AS3, come faccio a ottenere una definizione di classe di una risorsa incorporata con getDefinitionByName
-
01-07-2019 - |
Domanda
Ho una classe con molti embedded attività.
All'interno della classe, vorrei ottenere la definizione di classe di un bene in base al nome.Ho provato con getDefinitionByName(), e anche ApplicationDomain.currentDomain.getDefinition (), ma né lavoro.
Esempio:
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");
Soluzione
Questo non risponde alla tua domanda, ma si può risolvere il vostro problema.Credo che fare qualcosa come questo dovrebbe funzionare:
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");
Sto avendo un momento difficile ricordare se le parentesi opere in classi chiuse.Se non, una soluzione semplice è quello di marcare la classe come dinamica.
Altri suggerimenti
Il motivo per cui il metodo non funziona è perché "Image1Class" è un variabile nome, non l'effettivo Nome della classe.
È possibile ottenere il nome della classe come questo
import flash.utils.getQualifiedClassName;
trace(getQualifiedClassName(Image1Class));
Che come si può vedere, significa che il nome della classe (quella che dovrebbe essere passato alla funzione) è qualcosa di simile MyClass_Image1Class
.
Non c'è bisogno di utilizzare qualsiasi fantasia getDefinitionByName() metodi, semplicemente riferirsi ad esso in modo dinamico.Nel tuo caso, sostituire il 'Fallisce' riga con:
var classDef:Class = MyClass[name] as Class;
E che dovrebbe fare.
Grazie mille!Ho appena speso quasi 5 ore e ore cercando di ottenere il POS getDefinitionByName di lavoro con la getQualifiedClassName che ero pronto a buttare la roba!!Il mio ultimo lavoro codice simile a questo e prende anche il nome della stringa a partire da un array.
CreatureParam è un 2 dimensione array di stringhe;
Il tipo è un numero intero che viene inviato al flash da tag HTML, che è sua volta deriva da un database MYSQL tramite PHP.
Mark1_cb è una combobox che è sul palco e ha un nome di istanza.È uscita anche un numero intero.
Quindi, questo codice direttamente sotto le importazioni di classe "BirdBodyColor_mc" da un swf esterno "ArtLibrary.swf".BirdBodyColor_mc è un movieclip creato da un'immagine png.Nota è necessario fare doppio clic sul movieclip in ArtLibrary.fla e inserire un secondo fotogramma chiave.Movieclips apparentemente bisogno di due fotogrammi o flash tenta di importare come sprite e le cause di una mancata corrispondenza del tipo.
[Embed(source="ArtLibrary.swf", simbolo="BirdBodyColor_mc")] var BirdBodyColor_mc:Classe;
Normalmente, vorrei mettere un'istanza di questa classe movieclip sullo stage utilizzando questo codice.
myMC:MovieClip = new BirdBodyColor_mc();addChild(myMC);
var Definizione:Class = this["BirdBodyColor_mc"] come Classe;var 1:MovieClip = new Definizione();
Ma ho bisogno di fare questo utilizzando un valore di stringa cercata nel mio array.Così qui è il codice per che.
var Definizione:Class = questo[CreatureParam[Tipo][Mark1_cb + 2]] come Classe;var 1:MovieClip = new Definizione();