2010-04-08 14 views
0

這是Google無法正常工作的那些反覆出現的基本問題之一。我通常從我的課程派發事件並處理文檔類中的用戶界面。但是現在我想要將所有UI分離到一個單獨的類中,並可以通過其他類訪問。主要時間線上的參考符號

我已經將它作爲子項添加到主/文檔類中,但是如何在不通過parent.parent shananigans的情況下引用主類?

編輯。還有一件事我記得。我的一些UI元素沒有以編程方式添加。

這裏是我的代碼。我可能會得到未定義的屬性錯誤。

package rpflash.ui { 

import flash.display.Sprite; 
import flash.display.MovieClip; 
import flash.display.Stage; 
import nowplaying; 

public class RPUserInterface{ 

    public function RPUserInterface(){ 
     var np:nowplaying = new nowplaying(); 
     MovieClip(this.root).addChild(np); 
     } 


} 
} 

回答

1

如果我沒有記錯的話,根在AS3中已被棄用;如果你正在嘗試使用np MovieClip做的事情是將它添加到舞臺上,那麼只需一個簡單的this.addChild(np)即可。

至於從您的用戶界面引用您的主要文檔類中的東西,我假設你正在從主內部創建UI類?如果是這樣,最簡單的方法(儘管有些人可能會指出,你創建一個強引用,可能會泄漏內存)是在你的UI類中創建一個函數,它接受一個Main類型的對象,然後從Main調用它,它本身就是這樣的:

//inside Main 
UIclassInstance.setMain(this); 

//inside UI class 
public function setMain(mainIn:Main):void 
{ 
    main = mainIn; 
} 

你需要在你的UI類中有一個類型爲Main的成員變量。像這樣,您可以使用main.someObjectInMain;訪問Main中的內容。

希望幫助,

得不

1

你可能未定義的錯誤,因爲根本不是什麼它曾經是。根現在是結構的程序化基礎,舞臺已經成爲顯示對象的持有者,因此應該被引用用於添加子項等。

舞臺是一個動態屬性,僅針對處於顯示列表。所以如果你以編程的方式創建這個類,如果你只是改變了stage的根目錄,這可能會返回一個null錯誤,因爲它還沒有被賦予一個階段引用,因爲它沒有被添加到列表中。嘗試使用Event.ADDED_TO_STAGE偵聽器(如果它可能未被連接以確保該階段不會爲空)。

更重要的是,你正在計劃以這種方式將事物附加到舞臺上。一般來說這不是一個好主意,因爲舞臺本身不會直接引用孩子(雖然可以使用getChildByName或getChildAt),並且可能會導致後面丟失引用的問題。嘗試想着要麼將孩子目前的用戶接口或添加將分配某種價值的剪輯功能被傳遞,例如:在你的主時間軸

public static const PLAY_THIS:String = "the event to play the mc"; 

public function RPUserInterface(){ 
    var np:nowplaying = new nowplaying(); 
    addEventListener(Event.ADDED_TO_STAGE, init); 
} 

public function getClip():nowplaying{ 
    return np; 
} 

private function init(ev:Event):void{ 
    //If you want it to play immediately, else use mouseEvent etc 
    dispatchEvent(new Event(PLAY_THIS)); 
} 

var userInt:RPUserInterface = new RPUserInterface(); 
userInt.addEventListener(RPUserInterface.PLAY_THIS, addFromThis); 
addChild(userInt); 

private function addFromThis(ev:Event){ 
    //add a global var ref here if needed. 
    var clip = (ev.target as RPUserInterface).getClip(); 
    addChild(clip); 
} 

它可能看起來更加複雜和浪費空間,但它的良好實踐和更容易使這些類互動。其後更容易更改。