2012-10-19 12 views
2

我有一個主要項目,我想另一個項目的SWF文件加載到其中:AS3/Flex界面不兼容,當外部SWF

//loader code in Main class of main project 
var url:URLRequest = new URLRequest("../src/components/TextTool.swf");  
var ttWrapper:UIComponent = new UIComponent(); 
var ldr:SWFLoader = new SWFLoader(); 
var context:LoaderContext = new LoaderContext(); 
if (Security.sandboxType == Security.LOCAL_TRUSTED) { 
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); 
    }   ldr.source = "../src/components/TextTool.swf"; 
     ldr.loaderContext = context; 
     ldr.addEventListener(Event.COMPLETE, onLoadComplete); 
     ldr.load();  
     can.addElement(ldr); 

這裏的主類的第二個項目的代碼:

<?xml version="1.0" encoding="utf-8"?> 
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:stark="stark.*" name="textModule" >  
     <stark:TextTool name="myTF" id="myTF"></stark:TextTool> 
    </s:Application> 

現在這兩個項目都包含一個接口文件:具有相同代碼的IModule和第二個項目(正在加載的)的一個元素,它是我的自定義類「TextTool」的一個實例,它擴展s:組和實現IModule:

<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" width="400" 
     xmlns:com="src" 
     height="130" creationComplete = "initText()" implements="IModule"></s:Group> 

12:18我已經加載的SWF,我想訪問「myTF」的其中有TextTool實例和ID:

//Code in the main class of the main project 
    trace(getQualifiedClassName(mySwf.getChildByName('textModule')['myTF'])); 
    trace(mySwf.getChildByName('textModule')['myTF'] is IModule); 
    //output: 

    //stark::TextTool 
    //false 

正如我上面提到的,我有兩個項目中的接口,相同的代碼,它具有相對於主類相同的路徑,myTF擴展了IModule。在swf加載後,我得到正確的元素,但在驗證它是否實現IModule時仍然是錯誤的。 爲什麼?

+0

'textModule'表明它實現了什麼嗎?我想知道編譯器是否重命名了一個或兩個以防止內存中的衝突。 – ethrbunny

+0

'textModule'沒有實現IModule,你希望編譯器重命名的是什麼? –

回答

0

你執行

trace(mySwf.getChildByName('textModule') is IModule); 

測試Application我想你忘了添加['myTF']

trace(mySwf.getChildByName('textModule')['myTF'] is IModule); 
+0

我的不好。看起來我在複製/粘貼消息之前測試時刪除了[[「myTF」]。固定。 –

+0

@ user1759241它適用於我然後 –

+0

我做了一個小例子(我使用FlashDevelop),[http://au.optimum-web.com:8080/pub/alex/loader_test.rar]這裏是zip,如果你可以花幾分鐘時間看看我做錯了什麼? (當加載的swf被添加時,點擊舞臺,然後你會看到跟蹤)。 –

0

你都加載到不同的ApplicationDomain中,故取其負載第一勝。嘗試將它們加載到同一個ApplicationDomain中。

+0

我已經改變了'if(Security.sandboxType == Security.LOCAL_TRUSTED){''context.applicationDomain = ApplicationDomain.currentDomain;'給加載器的上下文當前的應用程序域,但仍然沒有成功。你的意思是別的嗎? –

+0

我在談論這一行var context:LoaderContext = new LoaderContext();如果你擺脫了這一點,不使用該參數,會發生什麼? –

+0

仍然返回false。我已經嘗試了所有使用這個[senocular的教程](http://www.senocular.com/flash/tutorials/contentdomains/?page=2)。但我做到了。我合併了這兩個項目,所以他們將使用1個接口文件,而不是兩個單獨的文件,儘管它們具有相同的包,名稱和代碼。儘管如此,使用這樣的結構來開展一個項目是非常不舒服的,如果一個人使用我的界面製作一個模塊然後給我發送swf文件會怎樣? –