Flash AS2, обнаруживающий динамически подключенные компоненты, инициализируется - PullRequest
2 голосов
/ 23 июня 2011

Хорошо, я схожу с ума, пытаясь вспомнить AS2 здесь, надеясь, что кто-то с лучшей памятью протянет руку ...

По сути, моя проблема заключается в использовании композиции и "ожидании" компонентов - например.компонент Button - чтобы быть готовым к прикреплению обработчика щелчков .. по разным причинам я ничего не могу поделать со всей установкой, поэтому вот ситуация ...

У меня есть мувиклип в библиотеке, нет классапросто идентификатор связи ("AttachMe").Этот клип имеет внутри себя компонент кнопки AS2 ('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 не определен в тот момент, когда я это делаю ...

Итак, что же здесь лучше всего делать?то есть это настоящая боль, и я знаю, что это «ожидание» инициализации компонента кнопки (в данном случае) перед добавлением обработчика событий.

Может сделать интервал / тайм-аут - ненавидеть идеютого, что.Может сделать enterFrame на mc, очистить его при первом вызове, затем добавить обработчик ... снова, просто кажется неправильным.onLoad не запускается для мувиклипа, поэтому я не могу добавить это (если бы я использовал наследование и пользовательский подкласс для библиотечного мувиклипа, я мог бы использовать onLoad).

Каждый способ кажется хаком, и мысльделать много раз удручает!Должно быть, это было сделано до смерти за эти годы, но я действительно не могу найти ничего, прямо упоминающего проблему и принятые решения ...

Любые мысли приветствуются!

Богат

1 Ответ

1 голос
/ 23 июня 2011

Правильно, третья попытка, и я пометил другие ответы для удаления. Попав в классы 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);, который, кажется, заставляет методы существовать сразу.

...