Как получить доступ к переменной родительского ролика из загруженного 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();