Как получить доступ к переменной родительского ролика из загруженного SWF

У меня есть SWF, который загружает внешний SWF. Загрузчик SWF имеет переменную, к которой я хочу получить доступ из загруженного SWF. я использую MovieClip(parent.parent).myVar но вернуть эту ошибку

Ошибка типа: ошибка № 1009: невозможно получить доступ к свойству или методу пустой ссылки на объект. at card01_fla::MainTimeline/frame1()

Загрузчик SWF имеет собственный класс документов, который, я думаю, является проблемой.

Заранее спасибо.

РЕДАКТИРОВАТЬ

Это как основной SWF

    package 
{
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.URLRequest;
    import flash.text.TextField;

    /**
     * ...
     * @author chchrist
     */
    public class CardSender extends Sprite 
    {

        private var loader:Loader;
        private var viewButtonArray:Array;
        private var sendButtonArray:Array;
        private var cardContainer:Sprite;

        public var testVar:String

        public function CardSender() {

            testVar = "it worked!!!";
            init();
        }

        private function init() {
            viewButtonArray = [cardsenderMC.view01, cardsenderMC.view02, cardsenderMC.view03, cardsenderMC.view04];

            for each( var viewButton in viewButtonArray) {
                viewButton.buttonMode = true;
                viewButton.addEventListener(MouseEvent.CLICK, onViewClick);
            }
        }

        private function onViewClick(e:MouseEvent):void {
            var cardName = "card"+e.target.name.substring(4)+".swf";
            loader = new Loader();
            loader.load( new URLRequest(cardName));
            loader.contentLoaderInfo.addEventListener(Event.INIT, onCardInit);
        }

        private function onCardInit(e:Event):void {
            addChild(loader);
            var content:* = loader.content;
            content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick);
        }

        private function onCloseClick(e:MouseEvent):void {
            removeChild(loader);
        }

    }
}

и я пытаюсь получить доступ к тестовой переменной из загруженного SWF с этим кодом

trace(MovieClip(parent.parent).testVar);

EDIT #2

Если я addChild(loader) не в onCardInit, но в onViewClick и в первом кадре загруженного SWF у меня есть Object(parent.parent).testVar это работает... но почему он не хочет быть внутри функции onCardInit?

5 ответов

Решение

У вас есть только один loader переменная, и вы создаете четыре Loader экземпляры и назначая их на него - так что если вы нажмете все четыре из них в быстрой последовательности, loader переменная будет эффективно содержать Loader объект, соответствующий последнему клику. Все твои addChild звонки будут действовать на то же самое Loader возражать - другие не будут добавлены, и их родители будут продолжать null

Внесите следующие изменения в код:

private function onCardInit(e:Event):void 
{
    addChild(LoaderInfo(e.currentTarget).loader);
    var content:DisplayObject = loader.content;
    trace(content);
    trace(content.closeButton);
    content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick);
}

private function onCloseClick(e:MouseEvent):void 
{
    trace(e.currentTarget);//should be the closeButton
    trace(e.currentTarget.parent);//should be the loaded swf
    trace(e.currentTarget.parent.parent);//should be the Loader object that loaded it

    //The following will work only if last three traced correctly
    removeChild(e.currentTarget.parent.parent);
}

Ответьте на следующее обновление в вопросе:

Если я addChild(loader) в onViewClick вместо onCardInit, затем Object(parent.parent).testVar в первом кадре загруженный SWF работает. Почему это не работает, если я добавляю Child в функцию onCardInit?

Опять же, это может быть потому, что вы добавляете другой loader объект - нажимаете ли вы на несколько кнопок просмотра? Нажмите на кнопку просмотра и подождите, пока она загрузится, чтобы увидеть, как она работает.

parent.parent не так. попробуйте использовать:

MovieClip(MovieClip(e.currentTarget.parent).parent).myVar ;

Вы должны привести первого родителя к какому-либо классу, например, MovieClip, а затем получить родительский объект этого нового MovieClip, а затем получить переменную внутри.

loader.content НЕ является мувиклипом, поэтому он не обладает такими же возможностями. пытаться

myLoadedClip:MovieClip = MovieClip(loader.content);

тогда ваш myLoadedClip.parent.myVar должен появиться

вы можете захотеть, чтобы ваш обработчик запускал Event.COMPLETE вместо Event.INIT

Попробуйте отследить parent и parent.parent, я уверен, что это из-за дополнительного "родителя"

Этот единственный строковый код в загруженном SWF разрешает это!;)

MovieClip (мувиклип (parent.parent).root).play();

Другие вопросы по тегам