Есть много способов сделать сцену доступной для класса дочернего объекта:
ОПЦИЯ 1
Самый простой способ - это проанализировать ссылку на сценукласс дочернего объекта:
Main.as (класс документа):
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
var foo:Foo = new Foo(stage);
}// end function
}// end class
}// end package
Foo.as:
package
{
import flash.display.Stage;
public class Foo
{
public function Foo(stage:Stage)
{
if(stage) trace("success"); // output: success
}// end function
}// end class
}// end package
ВАРИАНТ 2
Другим вариантом является добавление экранного объекта в список отображения.Таким образом, класс вашего экранного объекта будет иметь ссылку на сцену.Затем вам нужно добавить прослушиватель событий в классе вашего экранного объекта, который прослушивает экранный объект, который будет добавлен на сцену.Только когда получатель события получит это событие, у вас будет ссылка на сцену:
Main.as (класс документа):
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
var foo:Foo = new Foo();
addChild(foo);
}// end function
}// end class
}// end package
Foo.as:
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Foo extends Sprite
{
public function Foo()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
if(stage) trace("success"); // output: success
}// end function
}// end class
}// end package
ОПЦИЯ 3
Еще один вариант - сохранить ссылку на сцену в классе, к которому можно получить глобальный доступ.Для этого вы используете статические общедоступные свойства или методы для установки и получения ссылки на этап непосредственно в класс и из класса:
Main.as (класс документа):
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
GlobalVars.stage = stage;
var foo:Foo = new Foo();
}// end function
}// end class
}// end package
GlobalVar.as:
package
{
import flash.display.Stage;
public class GlobalVars
{
public static var stage:Stage;
}// end class
}// end package
Foo.as
package
{
import flash.display.Stage;
public class Foo
{
public function Foo()
{
var stage:Stage = GlobalVars.stage;
if(stage) trace("success"); // output: success
}// end function
}// end class
}// end package
[ОБНОВЛЕНИЕ]
Глядя на ваш код, я просто не мог понятьпочему ваш xmlReader
класс расширяет DisplayObject
в первую очередь.xmlReader
похоже обрабатывает всю логику, связанную с xml, например, загрузку и интерпретацию xml, так почему бы не оставить все как есть?Пусть другой класс обрабатывает объект на сцене.Я думаю, что реальным решением вашей проблемы является лучшая структура кода, примером которой является следующее:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
public class Main extends Sprite
{
public function Main()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
var textField:TextField = new TextField();
textField.name = "textField";
stage.addChild(textField);
var stageManager:StageManager = new StageManager(stage, "dummy.xml");
}// end function
}// end class
}// end package
import flash.display.Stage;
import flash.events.Event;
import flash.text.TextField;
class StageManager
{
private var _stage:Stage;
private var _xmlReader:XMLReader;
public function StageManager(stage:Stage, url:String)
{
_stage = stage;
_xmlReader = new XMLReader(url);
_xmlReader.addEventListener(Event.COMPLETE, onXMLReaderComplete);
}// end function
private function onXMLReaderComplete(e:Event):void
{
var textField:TextField = _stage.getChildByName("textField") as TextField;
textField.text = "XML LOADED!";
}// end function
}// end class
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.IOErrorEvent;
import flash.errors.IOError;
class XMLReader extends EventDispatcher
{
public var xml:XML;
public function XMLReader(url:String)
{
read(url);
}// end function
public function read(url:String)
{
var urlLoader:URLLoader = new URLLoader(new URLRequest(url));
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onURLLoaderIOError);
urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete);
}// end function
private function onURLLoaderIOError(e:IOErrorEvent):void
{
throw new IOError(e.text);
}// end function
private function onURLLoaderComplete(e:Event):void
{
xml = URLLoader(e.target).data as XML;
dispatchEvent(new Event(Event.COMPLETE));
}// end function
}// end class