0

ロードされたswfにを送信したいのですがdispatchEvent、に入れmovieclipます。私はそれについて良いトピックを見つけましたが、私の例は機能せず、「トレース」は表示されません。

編集。

  • 私はmain.as
  • 別のクラス:submenu.as、インポートするmain.as
  • の「メイン」メニューをクリックすると、main.asに送信しdispatchEventたいsubmenu.as(サブメニューの項目の1つを変更したいので、の「メインメニュー」をクリックすると、main.asを送信する必要があります)dispatchEventsubmenu.as
  • だから私は私dispatchEventのメソッドにを入れました:clickButtonmain.asEvent.CHANGE
  • そして、でsubmenu.as、私はこれを聞きたいですevent.CHANGE、そしてそれは私が以下に書いたものです

編集の終わり。

親クラスの場合:メニューをクリックするたびに:

dispatchEvent(new Event(Event.CHANGE));

また

stage.dispatchEvent(new Event(Event.CHANGE));

そして私の子供のクラスでは:

public function initStage (e:Event){
[…]
this.parent.addEventListener(Event.CHANGE, switchItem, false, 0, true);

private function switchItem(pEvent:Event):void
{
    trace("PARENT_CHANGED");
}   

何か案が?

4

3 に答える 3

1

子SWFから、loaderInfoからアクセスします。

loaderInfo.sharedEvents.addEventListener(Event.CHANGE, switchItem, false, 0, true);

編集内容からすると、main.asとsubmenu.asはどちらも同じSWFにあるように聞こえますが、問題はイベントをバブルダウンしようとしていることでしょうか。

子オブジェクトに対してイベントをディスパッチするか、次のような静的/シングルトンパターンを使用できます。

public static var dispatcher:IEventDispatcher = new EventDispatcher();

ディスパッチャに対してイベントをディスパッチし、ディスパッチャでイベントをリッスンします。

これは、ステージに対してイベントをディスパッチしようとしている方法と似ています。ただし、子供は「this.parent」ではなく、ステージに対して耳を傾ける必要があります。私はそれをお勧めしません。

それ以外の場合は、submenu.asで定義された子インスタンスに対するmain.asディスパッチイベントのように、親にイベントを子に渡してもらいます。

于 2011-10-15T21:48:51.860 に答える
1

私が知る限り、実行時に実際にswfをロードしていて、それらの間のイベントをリッスンしようとしているのでない限り、トピックはあまり当てはまりません。また、階層自体が本当に重要でない限り、参照を収集するためにディスプレイリストの階層を使用しないことをお勧めします。たとえば、このメニューは、閉じるときに親コンテナから自分自身を削除したり、同じコンテナにdisplayObjectを追加する必要があり、コンテナが何であるかを気にしない場合があります。階層を使用すると、参照用にその階層を維持する必要があり、成長するアプリケーションで変更を加えることが困難になる場合があります。参照を収集するためにディスプレイリストを使用しない、探しているものの例を次に示します。

public class Main extends Sprite 
{
    private var menu:SubMenu;

    public function Main():void 
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        menu = new SubMenu(this);
        addChild(menu)  //This is not neccessary for them to communicate
        dispatchEvent(new Event(Event.CHANGE));
    }

}

public class SubMenu extends Sprite
{
    private var mainMenu:IEventDispatcher;  //This could be typed as Main instead of IEventDispatcher if needed. 
                                            //Sprites are however IEventDispatchers

    public function SubMenu(mainMenu:IEventDispatcher) 
    {
        this.mainMenu = mainMenu;
        mainMenu.addEventListener(Event.CHANGE, switchItem, false, 0, true);
    }

    private function switchItem(event:Event):void
    {
        trace("Parent_Changed")
    }
}

ディスプレイリスト階層を使用した例を次に示します(お勧めしません):

public class Main extends Sprite 
{
    private var menu:SubMenu;

    public function Main():void 
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        menu = new SubMenu();
        addChild(menu)  //This is neccessary, and the menu cannot be added to a different parent

        dispatchEvent(new Event(Event.CHANGE));

    }
}
public class SubMenu extends Sprite
{

    public function SubMenu() 
    {
        //Neccessary because submenu will not have a parent when its first instantiated.
        //When its on the stage then you can have it grab its parent and add a listener.
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);

    }

    private function init(event:Event = null):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);

        //Parents available
        parent.addEventListener(Event.CHANGE, switchItem, false, 0, true);
    }

    private function switchItem(event:Event):void
    {
        trace("Parent_Changed")
    }

}
于 2011-10-17T00:09:12.220 に答える
1

2つの可能性があります。

まず、ブレークポイントを追加するか、関数this.parentに設定されているものをトレースしてみてくださいinitStage()。あなたが言っているdispatchEvent()stage.dispatchEvent()、しかし子が実際にMain自体のインスタンスではなく、Main内のオブジェクトに追加されている場合、それはおそらくイベントに対して間違ったオブジェクトをリッスンしています。

次に、initStage()イベントが発生する前に、それが実際に実行されていることを確認します。イベントのディスパッチ時にリスナーが設定されていない可能性があります。

于 2011-10-17T00:25:47.910 に答える