2010-09-01 85 views
0

我有一個簡單的應用程序加載另一個SWF在同一個域中的電影。我可以訪問加載的SWF中的變量和函數,但不能監聽來自按鈕的事件;在接收到運行時錯誤:錯誤#1009:無法訪問空對象引用的屬性或方法從加載的SWF收聽事件?

用於設置

var assetLoader:Loader = new Loader(); 
assetLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadingComplete); 
assetLoader.load(new URLRequest("home.swf"); 

function loadingComplete(evt:Event):void { 
... 
var asset:MovieClip = assetLoader.content as MovieClip; 
asset.homeTrace("function in loaded SWF"); 
trace("var in loaded SWF:", asset.lastFrame); 
// Error #1009 
asset.enterApp.addEventListener(MouseEvent.CLICK, homeButtons); 
... 
} 

主頁按鈕的鏈接屬性

var lastFrame:Boolean = false; 

function homeTrace(p1:String) { 
    trace(p1); 
} 

在此先感謝

回答

0

我已經實施了一個解決方案,而不是我想要的,但工作正常。因爲我無法添加監聽器在加載的影片按鈕,我添加了一個一般的和使用的開關來區分發送對象:

asset.addEventListener(MouseEvent.CLICK, homeButtons); 
... 
function homeButtons(evt:MouseEvent):void { 
    switch(evt.target.toString()) { 
    case "[object Send]": 
     nextScreen(evt); 
     break; 
    case "[object Enter]": 
     tmpEnter(evt); 
     break; 
    } 
} 
0

您發表正規的解決方案,但如果你更深入您可以找到解決方案如何添加事件偵聽器here並閱讀有關整個架構here

問候
尤金

+0

我將仔細查看Adobe論壇帖子。關於gskinner博客中的文章,這是一個基於Flex的解決方案,我正在使用Flash IDE。是的,你是對的,看得更深,你甚至可以找到石油或黃金!問題是知道去哪裏看! ;-) – hsands 2010-09-25 07:18:03

0

這個問題可能是您正在鑄造「資產」作爲MovieClip,它很可能是一個Sprite。最好把整個東西放在try .. catchif中,以防萬一,並將其​​轉換爲安全類型*以避免編譯時錯誤(或者如果您想要整個家庭使用接口併合並兩個applicationDomain上下文,但是這就是一個廣闊的話題)

function loadingComplete(evt:Event):void { 
    ... 
    var asset:* = assetLoader.content; 
    if(asset != null){ 
     try{ 
     connectModule(asset); 
     }catch(err:Error){ 
     trace("Error accessing module functions", err.getStackTrace()); 
     } 
    }else{ 
     trace("No module"); 
    } 
} 

function connectModule(module:*):void{ 
    trace("Using typeof", typeof(module), "using constructor", module.constructor, "has the function?", module['homeTrace'] != null); 
    module.homeTrace("Function load in swf"); 
    ... 
} 

connectModuletrace語句應該給你一些額外的調試信息,幫助你確定是什麼類型的對象被加載,以及是否有您試圖訪問該功能。 讓我知道這是否適合你。

+0

@ user61466:抱歉,延遲並感謝您的時間!爲了好奇,我會嘗試一下你的建議,但是我加載的SWF是帶有一些時間軸動畫的純Flash動畫,一些SimpleButtons和一個在最後一幀中的stop()。所以,我看不出它們可能與MovieClip實例有什麼不同 – hsands 2010-09-25 07:03:57

+0

@hsands:對不起,這並不重要。再次查看示例,錯誤:1009是空對象引用,即您正在訪問的東西不在那裏,我注意到這是在'asset.enterApp'之前,這意味着無論'enterApp'是什麼,它都不在那裏。如果這是舞臺上的動畫片段,那麼Flash播放器會有一些渲染延遲,導致它們不能立即在舞臺上出現。最好等待一個框架與'addEventListener'(或setTimeout,如果你需要的東西hacky),直到'enterApp'呈現。 – enzuguri 2010-09-28 12:28:04