0

我想将 a 发送dispatchEvent到已加载的 swf,放入movieclip. 我找到了一个很好的话题,但我的例子不起作用,“跟踪”没有出现。

编辑。

  • 我有一个main.as
  • 另一个类:submenu.as,我导入的main.as
  • 当我点击中的“主”菜单时main.as,我想发送一个dispatchEventsubmenu.as(因为我希望子菜单更改其中的一项,当我点击中的“主菜单”时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

我看到两种可能的可能性。

首先,尝试添加断点或跟踪函数this.parent中设置的内容initStage()。如果您说的是dispatchEvent()或者stage.dispatchEvent()实际上将子对象添加到 Main 中的对象而不是 Main 本身的实例,那么它可能正在为事件侦听错误的对象。

其次,确保initStage()在您的事件被触发之前实际执行。调度事件时可能未设置侦听器。

于 2011-10-17T00:25:47.910 回答