0

Flash Builder 4.6 で作成した 2 つのプロジェクトがあります。

  1. ActionScript プロジェクト
  2. モバイル フレックス プロジェクト

これらのプロジェクトは両方とも、ムービー クリップ アセットを含む同じ外部 SWF ファイル (Flash Professional CS6 で作成) をロードします (外部 SWF ファイルをロードするために同じ共有コードを使用します)。

どちらのプロジェクトも、swf アセット ファイル内のムービー クリップを拡張します。たとえば、swf ファイルには、1 つのテキスト フィールドを含む「Test」というムービー クリップがあります。リンケージ クラスは「MyTest」で、テキスト フィールドのインスタンス名は「txt1」です。

パブリックの「txt1」プロパティとプライベートの「var counter:int」を含む両方のプロジェクトに「MyTest」というクラスがあり、swf がロードされたら、次のコードを使用してクラスのインスタンスを作成します。

var x:MyTest = new MyTest();

actionscript プロジェクトではうまく機能し、x が正しく作成され、テキストフィールド txt1 が正しく設定されています。

ただし、flex プロジェクトでは txt1 プロパティが null であるため、インスタンスは外部 swf からの「Test」ムービー クリップのインスタンスではありません。

私は何を間違っていますか?モバイルフレックスプロジェクトではなく、アクションスクリプトプロジェクトで機能するのはなぜですか? これは、このすべての作業を行う共有コードであり、flex プロジェクトのためだけに新しいコードを書き直すのは嫌です...

ありがとう。


物事をより明確にするために

このコード片:

var cls:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("MyTest") as Class;
var x:Object = new cls();
trace(getQualifiedClassName(x));
var y:MyTest = x as MyTest;

x は、swf で定義されているように MyTest 型に設定され (「カウンター」プロパティを持たない)、y は null になります (セーフ ケースは成功しませんでした)。

4

1 に答える 1

0

あなたが言う時

var y:MyTest = x as MyTest

次に、明らかに何かが間違っています。リンケージ ID を介して swc で定義された MyTest には、(変数 y を MyTest 型として宣言できるようにする import ステートメントを介して) Flex プロジェクトにコンパイルされた MyTest にはない "もの" (物理グラフィックスなど) があります。について知る。そのため、特に両方の名前空間が同じである場合、衝突する 2 つの Class 定義があります。

y がライブラリ リンケージから作成された MyTest のインスタンスを保持できるとは思わず、一方から他方にキャストしようとすると null になると予想されます-まさにあなたが報告しているように。

ゲッター/セッターのペアを宣言する ITest インターフェイスを作成する方がよいでしょうtxt1(ちなみに、実際のプロダクション変数名として使用しないことを願っています)。その後、キャストは問題なく機能するはずです。

于 2013-03-03T21:17:53.783 に答える