初始化Flash AS2检测动态连接的组件

时间:2011-06-23 11:44:53

标签: flash components initialization actionscript-2 addeventlistener

好的,在这里试图记住AS2,让自己疯了,希望有更好记忆的人伸出援助之手......

基本上,我的问题是使用组合和'等待'组件 - 例如。一个Button组件 - 准备好附加一个点击处理程序......出于各种原因,我无法对整个设置做任何事情,所以这就是情况......

我在库中有一个movieclip,没有类,只有一个链接ID(“AttachMe”)。该剪辑内部有一个AS2 Button组件('btn')。

我有一个类获取对时间轴的引用,然后从库中附加mc,然后向该按钮添加一个事件侦听器。简单吧?

var foo:Foo = new Foo(this);

class Foo {

    private var tl:MovieClip; // timeline
    private var mc:MovieClip; // the attached movieclip

    function Foo(t:MovieClip){
        tl = t;
        mc = tl.attachMovie("AttachMe", "mc", 10);
        var b:Button = mc.btn;
        b.addEventListener("click", Delegate.create(this, onClick));
    }
    private function onClick(e:Object):Void{
        trace("Hi!");
    }
}

这不起作用,因为b.addEventListener在我正在做的时候是未定义的......

真的,这里的最佳做法是什么?即这是一个真正的痛苦,我知道在添加事件处理程序之前,“等待”按钮组件(在这种情况下)初始化的情况。

可以做间隔/超时 - 讨厌这个想法。可以在mc上做enterFrame,在第一次调用时清除它然后添加handler..again,似乎错了。 onLoad不会为movieclip触发,所以无法添加(如果我使用继承和我可以使用onLoad的库动画片段的自定义子类)。

每种方式似乎都是一种黑客攻击,多次做的想法令人沮丧!多年来一定是死了,但我真的找不到任何直接提到问题和接受解决方案的东西......

任何想法都赞赏!

1 个答案:

答案 0 :(得分:1)

是的,第三次尝试,我已经标记了其他删除的答案。在进入UIObject和Button课程之后,我想出了这个,这似乎有用:

import mx.utils.Delegate;
import mx.controls.Button;
import mx.events.EventDispatcher;

class Foo {

    private var tl:MovieClip; // timeline
    private var mc:MovieClip; // the attached movieclip

    function Foo(t:MovieClip)
    {
        tl = t;
        mc = tl.attachMovie("AttachMe", "mc", 10);
        var b:Button = mc.btn;
        EventDispatcher.initialize(b);
        b.addEventListener("click", Delegate.create(this, onClick));
    }
    private function onClick(e:Object):Void
    {
        trace("Hi!");
    }
}

这个重要的位是EventDispatcher.initialize(b);,似乎迫使方法立即存在。