2

Main.flaとSkinA.flaがあります。どちらにもMovieClipライブラリアイテムMC_BrandLogoがあります。
現在のアプリケーションドメインのMain.swfにSkinA.swfをロードして、Main.swf内のクラスを置き換えようとしています。Main.flaにライブラリアイテムがない場合は、正しいグラフィックでMC_BrandLogoをインスタンス化できます。MC_BrandLogoがMain.flaにすでに存在する場合、現在のアプリケーションドメインに新しいグラフィックをロードしても、そのグラフィックが使用されます。

既存のリンクされたムービークリップを動的にロードされたものに置き換える方法はありますか?

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSkinLoaded);
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loader.load(new URLRequest("SkinA.swf"));

function onSkinLoaded(e:Event):void {
    trace("loaded Skin");
    addChild(new MC_BrandLogo());
}

編集済み:オーバーライドしようとした画像をオーバーライドする方法はありません。これがアプリケーションドメインの動作方法だからです。親アプリケーションドメインに定義が存在する場合は、それらが使用されます。

4

2 に答える 2

2

パンチに殴られた。JonnyReevesは正しいと思います。このトピックに関する良い議論はここで見つけることができます:

Senocularのアプリケーションドメイン

于 2012-02-05T11:10:24.913 に答える
0

私の知る限り、実行時にバイトコードを操作する場合を除いて、ApplicationDomainのクラス定義を上書きすることはできません。

ただし、できることは、スキンSWFを子アプリケーションドメインにロードしてから、ApplicationDomain.getDefinitionを介して適切なクラス定義(シンボル)を取得することです。すなわち:

private var _skinAppDomain : ApplicationDomain;

function loadSkin() : void {
    // Keep a reference to the Skin's application domain.
    _skinAppDomain = new ApplicationDomain();

    var loader:Loader = new Loader();
    var context:LoaderContext = new LoaderContext(false, _skinAppDomain);

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSkinLoaded);
    loader.load(new URLRequest("SkinA.swf"));
}

function onSkinLoaded(e:Event) : void {
    var brandLogoSymbolName : String = "MC_BrandLogo";

    // Retrieve the symbol from the Skin's Application Domain directly.
    var brandLogoClipClazz : Class = _skinAppDomain.getDefinition(brandLogoSymbolName);

    // Check we have the symbol.
    if (brandLogoClipClazz == null) {
        throw new Error("Skin SWF must include a symbol named: " + brandLogoSymbolName);
    }

    addChild(new brandLogoClipClazz());
}

ApplicaitonDomainsで欠落しているシンボル名をデバッグするために、SWF Explorerを使用して含まれているすべてのクラス定義(シンボル)を一覧表示できます。

于 2012-02-05T11:08:22.557 に答える